Java:有没有办法在Set中从其克隆中检索原始对象

时间:2012-06-18 14:59:32

标签: java

我需要在Set中检索其克隆中的原始对象。

我想做点什么:

Set<Object> mySet;
public void myModifyMethod(Object clone){
    if(mySet.contains(clone)){
        Object original = mySet.get(clone); // get method does not seem to exist

        // Modify original object
    }
}

我在Java SE 6 API找不到任何方法来做到这一点。我能想到的唯一方法是遍历整个集合,但这根本没有效率(我希望从HashSet中获得O(1),而不是从顺序搜索中获得O(n)。

有更有效的方法吗?

3 个答案:

答案 0 :(得分:2)

我能想到的唯一解决方案是使用Map,其中原始对象既是键又是值,然后执行map.get(clone)之类的操作来获取原始对象。当然,您应该实施hashequals方法。

答案 1 :(得分:2)

在java集上有没有get方法

您可以重构并将所有元素添加到hashmap中 - Map具有get方法。

但是为什么你需要在一个Set中检索一个原始对象来自它的克隆,因为你已经有了它的一个实例,你用它来检查它是否存在 - 只是make确保你实现哈希码并适当地等于。

答案 2 :(得分:2)

我有类似的问题。我通过使用Map实现Set接口解决了这个问题。这是我的实施:

public final class HandleSet<E> extends AbstractSet<E> {

    private final HashMap<E, E> map;

    public HandleSet() {
        map = new HashMap<E, E>();
    }

    public E get(E o) {
        return map.get(o);
    }

    /* Implementation of Interface Set */

    @Override
    public Iterator<E> iterator() {
        return map.keySet().iterator();
    }

    @Override
    public int size() {
        return map.size();
    }

    @Override
    public boolean isEmpty() {
        return map.isEmpty();
    }

    @Override
    public boolean contains(Object o) {
        return map.containsKey(o);
    }

    @Override
    public boolean add(E o) {
        return map.put(o, o) == null;
    }

    @Override
    public boolean remove(Object o) {
        return o.equals(map.remove(o));
    }

    @Override
    public void clear() {
        map.clear();
    }

}
相关问题