我正在编写迷宫程序,但遇到了一些问题。
我有:
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
中实现了equals
和hashCode
:
@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/