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

标签 java hashset

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

我有:

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/

相关文章:

Java:动态加载外部类

java - 将具有相同值的数组添加到 HashSet 会导致重复项

java - 当字段不再使用时,我是否每次都必须 .clear() HashSet 和 HashMap ?

java - 在 Java 的 HashSets 上使用方法 retainAll 的时间和空间复杂度是多少?

c# - 如何在 C# 中对哈希集的坐标进行排序

java - 如何解决 OptimisticLockingFailureException?

java - Netty ChannelFuture 是如何工作的?

c# 获取 HashSet 的特定元素

java - 是否实现扩展类

Java Jar从命令行启动,但不是从intellij idea启动