我需要在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)。
有更有效的方法吗?
答案 0 :(得分:2)
我能想到的唯一解决方案是使用Map
,其中原始对象既是键又是值,然后执行map.get(clone)
之类的操作来获取原始对象。当然,您应该实施hash
和equals
方法。
答案 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();
}
}