簡體   English   中英

哈希集返回false何時應返回true

[英]hashset return false when should return true

我正在編程迷宮,但遇到一些問題。

我有:

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));

您將發現此返回錯誤。 這是為什么? 好吧,讓我們遵循邏輯。

首先,您有以下檢查:

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

如果您確實希望這樣做,則意味着您希望以String state作為參數來調用equals ,如下所示:

temp.equals(temp.getStateName())

(這種情況是上面的調用返回true的情況。)這是不正確的,我們不希望equals對於不相關的類返回true(就equals契約而言,這是不對稱的 )。 我認為這是意外的,就像一個錯誤。 您在編寫代碼時應該仔細考慮代碼的作用。

另外,您應該將字符串與equals而不是==進行比較

然后是這個構造:

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 ==返回字符串,則返回true;如果object的類不是State,則返回false。 這些是互斥的。

因此,您編寫的equals實現無效。 正確的equals以符合您hashCode是這樣的:

@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);
}

首先檢查對象是否不為空,並且其類為State (您擁有該部分的權利),然后檢查state成員是否等於另一個對象的state成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM