如何在java hashset中查找和返回对象

aurhwmvo  于 2023-04-10  发布在  Java
关注(0)|答案(6)|浏览(167)

根据HashSetjavadoc,HashSet.contains只返回一个布尔值。我如何在hashSet中“找到”一个对象并修改它(它不是一个原始数据类型)?
我看到HashTable有一个get()方法,但我更喜欢使用set。

yeotifhr

yeotifhr1#

您可以删除一个元素并添加另一个元素。
当一个对象在哈希集中时修改它是一个灾难的处方(如果修改改变了哈希值或相等行为)。

uemypmqf

uemypmqf2#

引用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;

既然你花钱买了一张Map,你不妨使用它。

a64a0gku

a64a0gku3#

您可以遍历集合以查找对象。
但是,API doc的警告:

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

h43kikqp

h43kikqp4#

Object oldobj; //object to modify
if (hashset.remove(oldobj)) {
   //
   // the following executed only if the object is already in the set
   //
   Object newobj = modify(obj); // get a modified copy
   hashset.add(newobj);
}
tjvv9vkg

tjvv9vkg5#

类似于:

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

if (hashSet.contains(obj) == true) {
    hashSet.remove(obj);
    obj.setSomething();
    hashSet.add(obj);
}
yks3o0rb

yks3o0rb6#

我遇到了同样的问题,并提出了以下解决方案(它应该实现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);
    }
}

相关问题