1

我需要在 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))。

有没有更有效的方法来做到这一点?

4

3 回答 3

2

我能想到的唯一解决方案是使用Map原始对象既是键又是值的地方,然后执行类似map.get(clone)获取原始对象的操作。当然你应该已经实现了hashequals方法。

于 2012-06-18T15:06:31.667 回答
2

java sets 上没有 get方法。

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

但是为什么你需要在 Set 中从它的 clone 中检索一个原始对象,因为你已经有了它的一个实例,你正在使用它来检查它是否存在——只要确保你适当地实现了 hashcode 和 equals 即可。

于 2012-06-18T15:06:49.030 回答
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();
    }

}
于 2012-06-18T15:18:17.910 回答