【问题标题】:Java Collections-> HashsetJava 集合-> 哈希集
【发布时间】:2011-08-16 20:14:10
【问题描述】:

我想在 HashSet 中处理一组类 (MyClass) 的对象。当我尝试添加一个已经存在的对象(依赖等于 MyClass 的 hashCode)时,该方法返回 false。有没有办法/方法来返回已经存在的实际对象?

请给我任何建议以处理该对象集合,以便在 add 返回 false 时能够获取现有对象作为回报?

【问题讨论】:

  • 如果您调用 add 并返回 false,您应该已经拥有该对象 - 您尝试将其传入!
  • @Josh.trow 虽然这是真的,但我猜 OP 想要的是该内存位置中的对象,而不是逻辑上相等的对象。

标签: java


【解决方案1】:

只需检查哈希集是否包含您的对象:

if (hashSet.contains(obj)) {
 doWhateverWith(obj);
}

【讨论】:

  • “== true”部分是多余的。
  • 这也没有回答问题。您仍然没有集合中的对象,只有一个与其相等的对象。
  • contains 只会在 obj 引用 HashSet 中的对象时返回 true,所以它会在集合中。
【解决方案2】:

没有对集合进行迭代,不,没有办法将集合的现有成员 equal 获取到刚刚添加的值。最好的方法是围绕 HashMap 编写一个集合包装器,将每个附加值映射到自身。

【讨论】:

    【解决方案3】:

    如果equals(..) 返回true,则对象是相同的,因此您可以使用您尝试添加到集合中的对象。

    【讨论】:

      【解决方案4】:

      为什么要让它返回您要添加的对象?你已经有了!

      只需执行以下操作:

      if (!set.add(item)) {
          // It already contains the item.
          doSomethingWith(item);
      }
      

      如果那没有达到预期的结果,那么它只是意味着该项目的equals() 实现不佳。

      【讨论】:

        【解决方案5】:

        一种可能的方法是:

        myClass[] myArray = mySet.toArray(new myClass[mySet.size]);
        List myList = Arrays.asList(myArray);
        MyClass myObject = myList.get(myList.indexof(myObject));
        

        当然,正如有些人指出的那样,如果插入失败,那么该元素就是您要查找的元素,除非您当然想要存储在该内存位置中的内容,而不是 equals hashCode 告诉你,即不是逻辑上相等的对象,而是 == 对象。

        【讨论】:

          【解决方案6】:

          当使用HashSet 时,不,据我所知,你不能这样做,除非遍历整个事情并在每个事情上调用equals()。但是,您可以使用 HashMap 并将每个对象映射到自身。然后调用put(),它将返回之前映射的值,如果有的话。

          【讨论】:

            【解决方案7】:

            http://download.oracle.com/javase/6/docs/api/java/util/HashSet.html#contains(java.lang.Object)

            您可以使用该方法来检查您是否喜欢;但您必须记住的是,您已经拥有存在的对象。

            【讨论】:

              猜你喜欢
              • 2016-12-09
              • 2012-11-13
              • 1970-01-01
              • 2010-11-30
              • 2019-09-29
              • 2015-02-04
              • 2012-03-25
              • 2019-05-03
              • 1970-01-01
              相关资源
              最近更新 更多