2013-08-05 56 views
0

我有兩個HashMap<HashSet<String>, Long>,我想根據密鑰進行比較。關鍵是HashSet<String>,我可能需要更改爲TreeSet<String>,但我不認爲這是必要的。我會如何比較這些?比較兩個HashMaps關鍵字是否相等?

注意:該地圖僅用作單個套件的包裝。

for(HashMap<HashSet<String>, Long> entry : ListOfMaps) { 
    if(entry.keySet().equals(entry2.keySet())) { 
     // do something 
    } 
} 

我想檢查Set1.equals(Set2)。

該集合必須完全相同。由於每個HashMap<Set<String>, Long>中只有一個Set<String>,這讓我感到緊張,我抓住了所有的鑰匙,或者這樣好嗎?集

+0

你有什麼應該工作,根據的Javadoc http://docs.oracle.com/javase/6/docs/api/java/util/AbstractSet.html#equals%28java。 lang.Object%29 – StormeHawke

+0

酷,只要確定,因爲我只有一組。 – user10297

+0

請注意,'HashSets'沒有排序,因此'.equals()'調用將確保第一組中的所有字符串都出現在第二個 – StormeHawke

回答

1

的equals()方法的合約上說:

如果給定對象也是一組,這兩組具有相同的大小,以及給定的所有成員都包含在這組

返回true 。這確保了equals方法在Set接口的不同實現中正常工作。

因此,只要Set實施遵循合同,您的代碼就會工作。

但是,這可能是危險的,這取決於您的代碼對用作鍵的集合所做的操作。一旦一個對象被用作Map中的一個鍵,它不應該改變,因爲這會破壞Map的契約。

Map<Set<String>, T> map = HashMap<>(); 
Set<String> mySet = new HashSet<>(); 

mySet.add("first"); 
map.put(mySet, myValue); 


Set<String> copyOfMySet = new HashSet<>(mySet); 

//returns true 
map.contains(copyOfMySet); 

//modifying mySet 
mySet.remove("first"); 

//this will now return false 
map.contains(copyOfMySet); 
+0

很酷,謝謝你的信息。 – user10297

+0

我只是使用Map作爲一個集合和一個時間戳的包裝。 – user10297

+0

一般來說,我個人避免使用集合,列表等作爲地圖的關鍵字,因爲它很容易破壞事物...作爲此評論的作者指出:) – StormeHawke