【问题标题】:how to find and return objects in java hashset如何在 java hashset 中查找并返回对象
【发布时间】:2011-01-19 05:16:10
【问题描述】:

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

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

【问题讨论】:

  • 谢谢大家!我的对象实际上包含一个我需要经常更新的链表,所以我认为我将只使用 HashTable 而不是为每个对象更新进行昂贵的迭代。

标签: java object hashtable contains hashset


【解决方案1】:

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

所以你是在为一张地图付费,你不妨使用它。

【讨论】:

  • 我想你是想说“使用 HashMap”……对吗? :-)
  • 是的。抱歉,有时我无法抗拒从答案中拼出小谜题的冲动。
【解决方案2】:

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

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

【讨论】:

  • 这并不完全正确。如果更改不影响对象的相等性(和哈希码),则修改 HashSet 元素是安全的。例如,如果 equals 和 hashCode 没有被覆盖,那么改变是安全的,因为它的相等性没有改变。
  • 是的,这就是我在括号中写这部分的原因。
【解决方案3】:

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

来自API doc 的警告:

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

【讨论】:

  • "你可以迭代..." 但是当然,如​​果你这样做,更新一个集合元素就变成了O(N) 操作。
【解决方案4】:
Object oldobj; //object to modify
if (hashset.remove(oldobj)) {
   Object newobj; //modified object
   hashset.add(newobj);
}

【讨论】:

    【解决方案5】:

    类似:

    MyObject obj = new MyObject();
    HashSet hashSet = new HashSet();
    hashSet.add(obj);
    
    if (hashSet.contains(obj) == true) {
        hashSet.remove(obj);
        obj.setSomething();
        hashSet.add(obj);
    }
    

    【讨论】:

    • 1. == true - 没有必要 2. 你没有检查.remove(obj) 的返回值 3. 如果你在下一步删除.contains() 是不必要的
    • 尽管一切都是真的,你也不应该这么挑剔:)
    【解决方案6】:

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

    【讨论】:

    • 无需委托。只需使用 HashMap 而不是 HashSet。
    猜你喜欢
    • 2013-03-27
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    相关资源
    最近更新 更多