12

根据 HashSet javadoc,HashSet.contains 只返回一个布尔值。如何在 hashSet 中“找到”一个对象并对其进行修改(它不是原始数据类型)?

我看到 HashTable 有一个 get() 方法,但我更喜欢使用该集合。

4

6 回答 6

13

您可以删除一个元素并添加一个不同的元素。

在散列集中修改对象是灾难的根源(如果修改改变了散列值或相等行为)。

于 2010-02-20T21:55:09.923 回答
13

引用股票 Sun java.util.HashSet 的来源:

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    static final long serialVersionUID = -5024744406713321676L;

    private transient HashMap<E,Object> map;

因此,您正在为地图付费,您不妨使用它。

于 2010-02-20T21:57:24.227 回答
2

您可以遍历集合以找到您的对象。

不过来自API 文档的警告:

“注意:如果将可变对象用作集合元素,则必须非常小心。如果对象的值以影响相等比较的方式更改,而对象是集合中的元素,则不指定集合的​​行为。 "

于 2010-02-20T21:56:55.240 回答
0
Object oldobj; //object to modify
if (hashset.remove(oldobj)) {
   Object newobj; //modified object
   hashset.add(newobj);
}
于 2010-02-20T21:58:16.410 回答
0

就像是:

MyObject obj = new MyObject();
HashSet hashSet = new HashSet();
hashSet.add(obj);

if (hashSet.contains(obj) == true) {
    hashSet.remove(obj);
    obj.setSomething();
    hashSet.add(obj);
}
于 2010-02-20T21:59:09.010 回答
-1

我遇到了同样的问题,想出了以下解决方案(它应该实现Set接口但不是所有的方法都在这里)

public class MySet<T> implements Set<T>{

    private HashMap<T,T> items = new HashMap<T,T>();


    public boolean contains(Object item) 
    {
        return items.containsKey(item);
    }

    public boolean add(T item) 
    {
        if (items.containsKey(item))
            return false;
        else
        {
            items.put(item, item);
            return true;
        }
    }

    public T get(T item) 
    {
        return items.get(item);
    }
}
于 2013-01-29T06:55:21.763 回答