【问题标题】:HashSet in Java - Comparison and hashkeysJava中的HashSet - 比较和hashkeys
【发布时间】:2012-03-24 00:15:45
【问题描述】:

我知道 HashSet.contains() 方法使用 .equals 方法来检查相等性,因为它检查指针以查看它们是否相等。

我需要它来检查指针处的实际对象是否相等 - 在我的特定情况下,我需要查看 HashSet 中是否已经存在正在打开的“节点”(一个 int[] 数组)。这对我的搜索算法至关重要,这样我的双向迭代深化搜索的实现就不会那么幼稚了。

如果可能,我仍然希望线性搜索时间,或者我应该使用不同的类?

感谢您的帮助。

【问题讨论】:

  • 抱歉,如果它已经在哈希集中,为什么不直接 get() 呢?如果哈希集不是太满,这将是 O(1)
  • @j13r:OP 想要使用contains(),它使用equals() 进行检查。
  • 据我所知,Java HashSets 没有 .get()

标签: java queue hashset


【解决方案1】:

引用相等只是 .equals() 的默认实现。你可以把你的数组放在一个覆盖 equals 和 hashCode 的包装类中来检查内容。注意:为了使这个工作,内容在您放入集合后不得更改

import java.util.Arrays;

public class IntArrayNode {

private int[] array;

public IntArrayNode(int[] array) {
  this.array = array;
}

//getter and setter

public boolean equals(Object obj) {
  if (obj != null && obj instanceof IntArrayNode) {
    return Arrays.equals(this.array, ((IntArrayNode) obj).array);
  } else {
    return false;
  }
}

public int hashCode() {
  return Arrays.hashCode(this.array);
}
}

【讨论】:

  • 快速回答你的问题 - 所以 .contains() 调用的 .equals() 方法是被搜索类型的 .equals 方法?
  • 是的,如果你创建 Set<IntArrayNode> set = new HashSet<IntArrayNode>();,那么当你创建 set.contains(someIntArrayNode); 时,它将使用你的 equals()。
  • instanceof 如果 obj 为 null,则计算结果为 false,因此不需要额外检查。另一方面,一个好的初始检查可能是 obj == this,在这种情况下,您可以立即返回 true。
  • 是的,因为我的芝士汉堡快要烧焦了,所以我很快就把它搞砸了 :) 会让它更标准
  • 更像if(obj == this) return true; if(obj instanceof IntArrayNode) //comparison code?
【解决方案2】:

如果您的对象实现了equals 方法,您可以进行任何您需要做的比较来确定您的两个Node 对象是否是唯一的。

【讨论】:

    【解决方案3】:

    最简单的解决方法是Collections.newSetFromMap(new IdentityHashMap<E, Boolean>())(作为HashSet的替代品),它不需要对元素或任何东西进行任何包装。

    【讨论】:

    • 好主意,但我还是使用了包装类,为了通用性,我没有在示例中使用它。
    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    相关资源
    最近更新 更多