2013-05-11 39 views
0

我有一個類學校:有效和高效地實施的hashCode()

public class School{ 

    private int noOfTeachers; 
    private int noOfStudents; 

    //setters and getters.... 

    public boolean equals(Object that){ 
    //instance of check.. 
     return (this.noOfTeachers == ((School)that).noOfTeachers || 
       this.noOfStudents== ((School)that).noOfStudents); 
    } 


    public int hashCode(){ 
     //What goes in here??? o.O 
    } 
} 

我應該如何與實施hashCode這個類進行?我無法想到一個包含noOfTeachersnoOfStudents計算散列的策略。而noOfTeachersnoOfStudents組合似乎違反了equalshashCode之間的合同。

+7

你是對的 - 任何與「或」的平等檢查都會違反傳遞性。 – 2013-05-11 18:21:07

+1

我不明白你的意思。當然,你可以'返回1' - 但是這樣做是無用的,因爲你的類不能在'HashMap'和'HashSet'中工作。你用什麼「equals」方法? – 2013-05-11 18:24:25

+0

我認爲你最好的選擇是離開'equals'和'hashCode'並創建一個方法來檢查它。覆蓋這些方法的原因是,'Collection'使用'equals'方法而不是使用'=='的默認方式來尊重相等性。 – 2013-05-11 18:28:43

回答

2

你不會找到任何適合你的課程的hashCode()實現,這將符合你的需求!因爲你的equals方法使用OR它的屬性的類。在equals方法中使用OR可爲任何對象的多個狀態返回true

所以使用hashCode()的唯一返回值,你當然不能表示多個狀態!更多的你應該知道,hashCode()必須返回一個對象的唯一值。 由於通過它返回多個值,導致模糊(並損害確定性)將對象放入任何地圖。因爲這違反了「地圖的鍵的唯一性」的假設。

+2

這當然不起作用。 OP想要一個**或**的「equals」方法。 – 2013-05-11 18:26:03

+0

如果兩個對象按照equals方法相等,那麼在這兩個對象的每一個上調用hashCode方法必須產生相同的**結果 – Anirudha 2013-05-11 18:33:33

+0

@BoristheSpider,我現在要求您再次看到答案,謝謝! – 2013-05-11 18:48:26