2012-04-03 35 views
0

我在Java中產生了一堆對象。每個對象都有屬性區和一組整數。我想要將這些對象存儲在地圖中(鍵值應該是越來越多的整數)。如果兩個對象的面積相等並且它們的集合相同,則兩個對象相同。在Java中找到相同的對象

如果兩個對象沒有相同的區域,那麼我不需要檢查它們的集合是否相同。

在Java中實現這一點的最佳實踐是什麼?我應該如何編寫散列和相等的函數?

回答

1

下面是由IDE生成的樣本對hashCode\equals

class Sample { 
    final int area; 
    final Set<Integer> someData; 

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

     Sample sample = (Sample) o; 

     if (area != sample.area) return false; 
     if (!someData.equals(sample.someData)) return false; 

     return true; 
    } 

    @Override 
    public int hashCode() { 
     int result = area; 
     result = 31 * result + someData.hashCode(); 
     return result; 
    } 
} 

此代碼假定someData不能爲空 - 以簡化事情。您可以看到首先檢查類型的相等性,然後檢查area相等性,然後檢查相等性Set<Integer>。請注意,在此使用內置equalsSet - 因此您已重新使用該方法。這是測試複合類型是否平等的慣用方法。

1

你只需要你的對象來實現Comparableinterface並在compareTo方法中編寫你的邏輯。這是一個很好的link來幫助你實現這一目標。

+3

只有在您要對對象進行排序時才需要。如果你只需要有這樣的對象的字典,你只需要適當的'hashCode()'和'equals()' – 2012-04-03 12:56:44

1

只需要在equals(在==之後進行類型檢查當然)首先比較它們的區域,如果它們不同,則返回false。如果面積相等,繼續比較。

對於實施equals(和hashCode)一般來說,這裏是a relevant threada good article(包括幾個進一步的參考文獻)。

1

一條經驗法則是,你應該比較您的equals()執行所有相關領域(最快第一,所以在前面比較你area s,則整臺),並在您的hashCode()使用相同的字段。如果有疑問,使用Eclipse的Source - Generate hashCode() and equals()...特徵(。,然後修復equals()代碼到第一比較area多個)

相關問題