发出「;包括「;哈希集方法(Java)
以下代码没有给出我期望的结果:发出「;包括「;哈希集方法(Java),java,set,contains,hashset,Java,Set,Contains,Hashset,以下代码没有给出我期望的结果: public static void main (String[] args) { Set<Pair> objPair = new LinkedHashSet<Pair>(); objPair.add(new Pair(1, 0)); System.out.println("Does the pair (1, 0) exists already? "+objPair.contains(new Pair(1, 0)
public static void main (String[] args) {
Set<Pair> objPair = new LinkedHashSet<Pair>();
objPair.add(new Pair(1, 0));
System.out.println("Does the pair (1, 0) exists already? "+objPair.contains(new Pair(1, 0)));
}
private static class Pair {
private int source;
private int target;
public Pair(int source, int target) {
this.source = source;
this.target = target;
}
}
我不明白为什么它不起作用。
或者我使用“contains”方法是错误的(或者是因为错误的原因)
还有一个问题,,
如果我添加两次相同的值,它将被接受,即使是一个集合
objPair.add(new Pair(1, 0));
objPair.add(new Pair(1, 0));
它不会接受/识别我创建的类对吗
提前感谢。您需要重写
对中的hashCode
和equals
方法LinkedHashSet
(以及其他使用哈希代码的Java对象)将使用它们来定位和查找您的Pair
对象。没有您自己的hashCode()实现,Java认为两个Pair
对象只有在定义上完全相同时才是相等的,始终创建“新”对象。在你的情况下,你想<代码>配对> /Cord>对象,如果它们对于“代码>源代码和<代码>目标< /代码>的值相同,则要考虑相等。要做到这一点,你需要告诉Java它应该如何测试<代码>配对< /Cord>对象以达到相等。(为了使散列映射按您期望的方式工作,您还需要生成与equals一致的散列码——松散地说,这意味着相等的对象必须生成相同的散列码,而不相等的对象应该生成不同的散列码
大多数IDE都会为您生成合适的hashcode()和equals()方法。我的IDE生成了以下方法:
@Override
public int hashCode() {
int hash = 3;
hash = 47 * hash + this.source;
hash = 47 * hash + this.target;
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Pair other = (Pair) obj;
if (this.source != other.source) {
return false;
}
if (this.target != other.target) {
return false;
}
return true;
}
HashSet
使用哈希代码。您的hashCode()
实现在哪里?哦,是的,我在这方面是新手,我可能需要进一步研究:)非常感谢!真不敢相信这是“唯一”的:)我想我忘了提到我是Java新手(不过你们注意到了…)非常感谢!我们曾经都是新人……)@NyanMaru建议如果你想大量学习Java,就阅读本书:——本书第9项包括hashCode
和equals
——我每隔几年就重读一次这本书,每次都学到一些新东西,第二版出版时就买了。
@Override
public int hashCode() {
int hash = 3;
hash = 47 * hash + this.source;
hash = 47 * hash + this.target;
return hash;
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Pair other = (Pair) obj;
if (this.source != other.source) {
return false;
}
if (this.target != other.target) {
return false;
}
return true;
}