簡體   English   中英

你有多個哈希碼和等號嗎?

[英]can you have multiple hashcode and equals

好吧,我需要指出正確的方向。 我已經有一個哈希碼和一個帶有重載的equals方法。

@Override 
public int hashCode() {         
    return  type.hashCode() ^ type2.hashCode() ^ type3.hashCode()  ;        } 

@Override 
public boolean equals(Object obj) { 
    if (!(obj instanceof MyObject)) {
        return false;
    }
    MyObject mdc = (MyObject) obj; 
    return mdc.type.equals(type) && mdc.type2.equals(type2) && mdc.type3.equals(type3); 
}

現在如果我只想比較第一種和第二種而不是第三種呢? 我可以使用兩個哈希和相同的方法供以后使用嗎?

我想要做的是,如果類型1和類型2匹配,則從當前的arraylist中刪除它們並將它們添加到新列表中,顯示哪些類型相同。 這與上面顯示的哈希碼不同。

在數組中有另一種方法,我可以看到type1和type2的哪個組合多次出現?

例如:

  • 拍攝光環
  • 射擊CallofDuty
  • 賽爾福扎
  • ............
  • .........
  • ..........
  • 拍攝光環

Shooting Halo出現兩次,需要將它們刪除並添加到另一個列表中,但問題是我已經有一個以前使用的哈希碼。

編輯:我想感謝大家的想法。 我已經通過創建另一個具有類似getter和setter但具有更新的哈希代碼的對象類來解決這個問題。 下次我將使用更好的邏輯方法。 我在這篇文章中的主要目標是知道是否有任何方法可以在一個類中使用多個哈希碼和方法,這顯然是不可能的。 :)

你不能在同一個類中有兩個具有相同簽名的方法,所以它不可能(這是java類/方法的通用原則,而不僅僅是equalshashcode方法)。

正如Dennis Meng評論的那樣,如果遇到這種情況,你需要重新思考你的設計。

現在如果我只想比較第一種和第二種而不是第三種呢?

聽起來我的要求驅動創建可以正確比較對象的不同類。 所以一個類知道它應該只比較type1和type2而另一個知道它應該比較所有3個(可能是對象的層次結構?)

在一堂課中,沒有辦法。 您可以對類進行子類化並覆蓋hashCode()equals(..) ,並在一種情況下使用一個類的實例,而在另一種情況下使用另一個類的實例。 但是這整個場景看起來像是災難的候選人,所以重新考慮你是否真的需要它。

在您只想定義多個排序順序的情況下,請使用外部Comparator實例。

您不能擁有兩個具有相似簽名的方法。 無論你提到什么邏輯,你都可以放入現有的equals方法並相應地返回結果

這聽起來像你真正的問題不是等於,哈希碼的東西...它試圖處理一些集合已經有一個你試圖把第二個進入並嘗試用一個equals,hashcode不僅僅知道被比較的兩個對象。 我想我正在“重新思考你的邏輯”列車,我相信你想要構建的集合更多的是Map<String,List<MyObject>>不是Set<MyObject>我認為你正在努力用。

如果您嘗試將MyObject實例推送到的數據結構是Map<String,List<MyObject>> ,則MyObject equals / hashCode問題完全消失,因為關於equals()和hashcode()的字符串的默認處理將起作用。

在你的例子中,這最終像......

[ "Shooting Halo", [ MyObject("Shooting Halo"), MyObject("Shooting Halo") ],
[ "Shooting CallofDuty", [ MyObject("Shooting CallofDuty") ],
[ "Racing Forza", [ MyObject("Racing Forza") ]

構建集合后,您可以解析它並找出如何處理具有多個值的Keys。 如果您走這條路,請查看Google Guava庫中的Multimap,因為它使這個用例變得微不足道。 http://code.google.com/p/guava-libraries/wiki/NewCollectionTypesExplained

暫無
暫無

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

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