gpt4 book ai didi

java - 当应该返回 true 时 hashset 返回 false

转载 作者:行者123 更新时间:2023-12-01 13:09:54 28 4
gpt4 key购买 nike

我正在编写迷宫程序,但遇到了一些问题。

我有:

HashSet<State> closedList = HashSet<State>(); //it hold State objects

我的 State 类如下所示:

public class State implements Comparable<State>{
private double f;
private double g;
private String state;
private State prev;
.
.
.

closedList.add(state);
closedList().contains(state); // this equals true

但是当我这样做时:

State temp = State(0,0,"");
temp.setStateName(state.getStateName());

closedList().contains(temp); // this equals false

我已经在State中实现了equalshashCode:

@Override
public int hashCode(){
return state.hashCode();
}

@Override
public boolean equals(Object object){
if(this.state == object){
return true;
}
if(object == null || object.getClass() != this.getClass()){
return false;
}
return false;
}

最佳答案

closedList().contains(state); // this equals true

这是一个红色鲱鱼,它只返回 true,因为 HashSet 在调用 equals 之前检查 ==

你应该尝试的是这样的:

State temp = new State(0, 0, "");
System.out.println(temp.equals(temp));

你会发现这返回 false。这是为什么?好吧,让我们遵循这个逻辑。

首先,您有这张支票:

if(this.state == object){
return true;
}

如果您确实希望如此,则意味着您希望使用字符串 state 作为参数调用 equals,如下所示:

temp.equals(temp.getStateName())

(上面的调用就是返回 true 的情况。)这是不正确的,人们不会期望 equals 对于不相关的类返回 true(并且就 equals 契约而言,这不是对称的) )。我认为这是无意的,就像一个错误。当你编写代码时,你应该更仔细地考虑你的代码在做什么。

你也应该是comparing Strings with equals, not == .

然后是这个结构:

if(object == null || object.getClass() != this.getClass()){
return false;
}
return false;

这是毫无意义的,因为首先它在逻辑上意味着这样,无论哪种方式都返回 false:

if(object == null || object.getClass() != this.getClass()){
return false;
} else {
return false;
}

其次,结合之前的检查,这并不是特别合乎逻辑:

if(this.state == object)
return true;
if(object.getClass() != this.getClass())
return false;

如果 object 是 String 的 ==,则返回 true,但如果 object 的类不是 State,则返回 false。这些是相互排斥的。

所以你写的 equals 实现不起作用。与您的 hashCode 匹配的正确 equals 如下所示:

@Override
public boolean equals(Object object){
if(object == null || object.getClass() != this.getClass()){
return false;
}

State other = (State)object;
return this.state.equals(other.state);
}

首先检查该对象是否不为 null 并且其类是 State (这部分是正确的),然后检查 state 成员是否等于其他成员对象的 state 成员。

关于java - 当应该返回 true 时 hashset 返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22967164/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com