Java:从HashSet中检索元素

JJ1*_*180 35 java

希望有人可以解释为什么我无法从中检索元素HashSet.

我考虑HashSet包含列表MyHashObjects与他们hashCode()equals()方法正确地覆盖.

我希望做的是构建一个MyHashObject自己,并将相关的哈希码属性设置为某些值.我可以查询HashSet使用该contains()方法查看集合中是否存在"等效"对象.因此,即使contains()对于2个对象返回true,它们也可能不是==真的.

那怎么会有get()类似的contains()工作方法呢?

有兴趣了解这个API决定背后的想法

and*_*soj 31

如果您知道要检索的元素,那么您已经拥有了该元素.在Set给定元素的情况下,答案的唯一问题是它是否contains()存在.

如果要对元素进行迭代,只需使用a Set.iterator().

听起来你要做的就是为元素的等价类指定一个规范元素.您可以使用a Map<MyObject,MyObject>来执行此操作.请参阅此SO问题问题进行讨论.

如果你真的决心找到一个元素,.equals()你的原始元素必须使用你必须使用的约束HashSet,我认为你已经坚持迭代它并检查equals()自己.API不允许您通过其哈希码获取内容.所以你可以这样做:

MyObject findIfPresent(MyObject source, HashSet<MyObject> set)
{
   if (set.contains(source)) {
      for (MyObject obj : set) {
        if (obj.equals(source)) 
          return obj;
      } 
   }

  return null;
}
Run Code Online (Sandbox Code Playgroud)

蛮力和O(n)丑陋,但如果这是你需要做的......

  • 但这不是我想要的元素.我想要集合中的元素,而不是我拥有的与hashCode等效的元素.那有意义吗? (4认同)
  • 这是一个HashSet.我假设HashSet中只有一个对象存在该哈希码? (3认同)
  • contains(Object):“当且仅当此集合包含满足 (o==null ? e==null : o.equals(e)) 的元素 e 时,才返回 true”。因此,hashCode 只是更快地找到对象的帮助者。 (2认同)

MVM*_*MVM 10

你可以HashMap<MyHashObject,MyHashObject>代替HashSet<MyHashObject>.

调用ContainsKey()你的"重建" MyHashObject将首先hashCode()检查集合,如果一个重复的哈希码被命中,最后 - 检查equals()你的"重建"对原始,你可以使用它来检索原始get()

这是O(1),但缺点是你可能必须覆盖两者equals()hashCode()方法.


Jon*_*uis 7

听起来你实际上是在尝试将哈希码用作地图中的键(这是HashSets在幕后所做的).你可以通过声明明确地做到这一点HashMap<Integer, MyHashObject>.

getHashSets 没有,因为通常您将get作为参数提供给方法的对象与您将返回的对象相同.

  • 如果有人想为HashSets使用`get`方法,那么`hashcode`和`equals`方法可能不会使用**ALL**对象的属性来计算和处理结果.也许剩下的属性包含一些其他值. (3认同)

Igo*_*sky 5

如果你知道你的元素的顺序设置,可以通过转换检索它们设置阵列。像这样:

Set mySet = MyStorageObject.getMyStringSet();
Object[] myArr = mySet.toArray();
String value1 = myArr[0].toString();
String value2 = myArr[1].toString();
Run Code Online (Sandbox Code Playgroud)