Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的哈希集-比较和哈希键_Java_Queue_Hashset - Fatal编程技术网

Java中的哈希集-比较和哈希键

Java中的哈希集-比较和哈希键,java,queue,hashset,Java,Queue,Hashset,我知道HashSet.contains()方法使用.equals方法检查相等性,因为它会检查指针以确定它们是否相等 我需要它检查指针处的实际对象是否相等——在我的特定情况下,我需要查看HashSet中是否已经存在正在打开的“节点”(int[]数组)。这对于我的搜索算法至关重要,这样双向迭代深化搜索的实现就不会那么幼稚了 如果可能的话,我仍然希望使用线性搜索时间,或者我应该使用不同的类 谢谢你的帮助 如果您的对象实现了equals方法,您可以进行任何需要进行的比较,以确定两个节点对象是否唯一。如果

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

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

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


谢谢你的帮助

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

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

引用相等只是.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);
}
}

引用相等只是.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);
}
}

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

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

对不起,如果它已经在HashSet中,为什么不直接获取它呢?如果HashSet不是太多,那么这将是O(1)full@j13r:OP想要使用
contains()
,它使用
equals()进行检查
。据我所知,Java hashset没有.get()。对不起,如果它已经在一个hashset中,为什么不直接获取它呢?如果hashset不太好,这将是O(1)full@j13r:OP想要使用
contains()
,它使用
equals()
进行检查。据我所知,没有.get()对于Java HashSets,请回答一个快速问题-那么.contains()调用的.equals()方法就是所搜索类型的.equals方法吗?是的,如果您创建一个
Set=new HashSet();
那么当您执行
Set.contains(someintaraynode);
时,它将使用您的equals()如果obj为空,则.
instanceof
的计算结果为false,因此不需要额外检查。另一方面,一个好的初始检查可能是如果obj==this,在这种情况下,您可以立即返回true。true,由于我的奶酪汉堡即将烧焦,所以它很快就消失了:)将使它更标准化更像
if(obj==this)返回true;if(obj instanceof IntArrayNode)//比较代码
?快速询问您的答案-那么由.contains()调用的.equals()方法就是所搜索类型的.equals方法?是的,如果您创建一个
Set=new HashSet()然后当您执行
设置.contains(someIntArrayNode)时
它将使用equals()。
instanceof
在obj为null时计算为false,因此不需要额外检查。另一方面,一个好的初始检查可能是obj==this,在这种情况下,您可以立即返回true。true,因为我的奶酪汉堡快要烧了,所以它很快就消失了:)将使它更标准更像
if(obj==this)返回true;if(obj instanceof IntArrayNode)//比较代码
?好主意,但我无论如何都在使用包装类,为了通用性,我没有在示例中使用它。好主意,但无论如何我都在使用包装类,为了通用性,我没有在示例中使用它。