2013-10-16 113 views
2

這是我第一次發佈問題。重寫hashcode()和equals()的HashMap在我的情況下不起作用

請幫我解決我的問題。 在這段代碼中,我使用HasMap來存儲鍵值對,這裏的鍵是帶有三個由「」空格分隔符分隔的SubStrings的String。

例如,

String t1 = new String("A B C"); 
and stored in HashMap as- 

m.put(t1,27); 

在此,A,B和C是三種不同的字符串。 A,B,C的不同組合假定爲唯一的。

Like "A B C", "B A C", "C B A" are all treated as equal. 

我實現這個hashCode()和等於(), 下面的代碼應該只打印

A B C:61046662 

但它甚至沒有調用hashCode()方法還是equals()。請給我一些建議。

public class Test { 
public int hashCode(){ 
    System.out.println("hashcode method called"); 
    return this.toString().length();  
} 

public boolean equals(Object obj) { 
    System.out.println("equal method called "); 
    int count = 0; 
    if(!(obj instanceof String)) 
     return false; 
    if (obj == this) 
     return true; 
    count = 0; 
    StringTokenizer st = new StringTokenizer(((String)obj).toString(), " "); 
    while(st.hasMoreTokens()){ 
     if(this.toString().contains(st.nextToken())){ 
      count ++; 
     } 
    } 
    return (count == 3); 
} 

public static void main(String[] args) { 

    HashMap<String, Integer> m = new HashMap<String, Integer>(); 

    String t1 = new String("A B C"); 
    String t2 = new String("B A C"); 
    String t3 = new String("C B A"); 

    m.put(t1, 27); 
    m.put(t2, 34); 
    m.put(t3, 45); 

    System.out.println(m.get("A B C")); 

    for(Entry e : m.entrySet()){ 
     System.out.println(((String)e.getKey())+":" +e.getKey().hashCode()); 
    } 
} 
} 
+0

兩者彼此不相關。您完全沒有使用Test class – Raghav

回答

3

equals()hashCode()方法進不來的圖片,因爲地圖鍵String型的,而不是Test型。因此正在使用標準字符串比較和散列碼。

您需要修改Test,以便它包含該字符串,並相應地更改equals()hashCode()。然後,您需要將地圖更改爲HashMap<Test,Integer>

+0

感謝您的指導。 好吧,我明白爲什麼它不工作的概念。 現在實際上我需要的是,我有與上面給出的相同的HashMap。 我需要從條目中刪除「A B C」的重複項。我應該用什麼方法。 我認爲上面會是正確的做法。 –

0

密鑰的hashCode用於確定密鑰的位置和唯一性。您將String對象添加到地圖,因此使用String.hashCode方法。 雖然你已經爲你的Test類實現了hashCode,但是並沒有使用它們。

要解決您的問題,您可以使用自己的hashCode實現創建自己的用作鍵的類。 使用你的例子,你可以添加一個屬性到你的Test類中,該類可以容納一個字符串,並在你的地圖中使用Test類作爲鍵。

相關問題