2011-06-06 73 views
5

你好
如果您在HashMap<String,String>一個鍵 - 值對的特定值進行搜索,你可以寫:HashMap.containsKey() - 如何搜索類?

myHashMap.containsKey(myString); 

但我又怎麼去管理它,如果關鍵是不是一個字符串?我有一個看起來像這樣的課程:

public class Kategorie implements Comparable { 
    private String name; 

    public Kategorie() { 
     super(); 
    } 

    public Kategorie(String name) { 
     setName(name); 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    @Override 
    public int compareTo(Object o) { 
     if (!(o instanceof Kategorie)) 
      throw new ClassCastException(); 

     Kategorie k = (Kategorie)o; 
     String name = k.getName(); 
     return this.getName().compareTo(name); 

    } 
} 

在地圖中,我保存了此類型的鍵和值「Kategorie」。

mapKategorieDEundEN.put(new Kategorie(strName_de), new Kategorie(strName_en)); 

在後面的代碼中,我想檢查是否有特定字符串的鍵。

if (mapKategorieDEundEN.containsKey(searchString)) { 

...不起作用,因爲密鑰不是字符串而是「Kategorie」,這很清楚。

然後我試圖這樣的事情:

if (mapKategorieDEundEN.containsKey(new Kategorie(searchString))) { 

...沒有工作過。我認爲它沒有找到任何東西,因爲該對象不是「原始」對象而是一個新對象。

在這種情況下,我可以使用containsKey還是必須在HashMap上使用循環?

回答

5

您的課程應覆蓋equalshashCode,它將在此之後工作。

HashMap/Hashtable通過使用鍵的hashCode將項目放入「桶」中,因此一個表示與另一個對象相同的值的新對象應被視爲同一對象,必須返回相同的hashCode 。所有返回相同hashCode的鍵將被視爲候選者,並且將調用equals。如果equals返回true,則認爲它是匹配的。

+0

+1:按照HavMap的javadoc。 – 2011-06-06 08:01:23

+0

@downvoter,請解釋一下你的hit-and-run downvote。 – 2011-06-06 08:03:35

+0

是的,我很高興知道爲什麼我的回答是downvoted。 – Kaj 2011-06-06 08:09:28

1

HashMap使用hashCode()equals()。你必須執行它們。如果你不知道如何。檢查你的IDE(日食)通常可以爲你生成它們。

0

如果要使用compareTo方法訪問對象,則不應使用基於hashCode/equals的Map,而應使用SortedMap,如TreeMap(或ConcurrentSkipListMap)。

這有附加好處,它使基於範圍的查詢(例如「給我所有類別比這更大」),但是有點慢(O(log n)而不是O(1)),簡單get訪問與基於散列的訪問相比(具有良好的散列碼,而不是恆定的)。

對於一般用途類,定義hashCode/equals和compareTo都是明智的,那麼類的用戶可以決定使用哪種類型的地圖。 (如果有不同的方法來排序你的對象,最好提供不同的比較對象。)

作爲一個方面的說法,你不應該實現Comparable,而是Comparable<Kategorie>。然後,您的compareTo方法將如下所示:

public int compareTo(Kategorie k) { 
    String name = k.getName(); 
    return this.getName().compareTo(name); 
}