Java:从 HashSet 中检索元素

新手上路,请多包涵

希望有人能解释为什么我无法从 HashSet 中检索元素。

Consider my HashSet containing a list of MyHashObjects with their hashCode() and equals() methods overridden correctly.

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

那么为什么没有 get() 方法类似于 contains() 的工作原理?

有兴趣了解此 API 决策背后的想法

原文由 DJ180 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 595
2 个回答

如果您知道要检索的元素是什么,那么您已经拥有了该元素。给定一个元素, Set 唯一要回答的问题是它是否 contains() 它与否。

如果你想迭代元素,只需使用 Set.iterator()

听起来您要做的是为元素的等价类指定规范元素。您可以使用 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;
}

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

原文由 andersoj 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以 HashMap<MyHashObject,MyHashObject> 而不是 HashSet<MyHashObject>

Calling ContainsKey() on your “reconstructed” MyHashObject will first hashCode() -check the collection, and if a duplicate hashcode is hit, finally equals() -检查你的“重建”与原件,你可以使用 get() 检索原件

这是 O(1),但缺点是您可能必须同时覆盖 equals()hashCode() 方法。

原文由 MVM 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题