我需要獲取密鑰列表,其中值與HashMap中的密鑰值相同。 例如,我的散列表包含以下元素。獲取這些密鑰值相等的密鑰列表
Key Value
1 a,b
2 e,c
3 a,b
4 f
5 e,c
6 c
我們需要評估作爲
1,3 contains value (a,b)
2,5 contains value (e,c)
4 contains value (f)
6 contains value (c)
THX
我需要獲取密鑰列表,其中值與HashMap中的密鑰值相同。 例如,我的散列表包含以下元素。獲取這些密鑰值相等的密鑰列表
Key Value
1 a,b
2 e,c
3 a,b
4 f
5 e,c
6 c
我們需要評估作爲
1,3 contains value (a,b)
2,5 contains value (e,c)
4 contains value (f)
6 contains value (c)
THX
你可以翻轉你的哈希:建立與密鑰類型是當前地圖的值的類型的新的哈希,和值鍵入是您當前地圖的關鍵字類型的列表。
迭代當前地圖的按鍵,並將它們推送到新地圖中的右側插槽。然後你就會得到你所要求的映射。
如果您當前的地圖中的值目前不能直接比較,那麼您需要找到一個表示。這完全取決於數據的性質。
一種簡單的方法是對列表進行排序,並使用toString
表示作爲新密鑰。這僅適用於基礎對象的toString
表示法爲此目的而合理。
您可以創建其他映射,其中您的鍵a用作值和值作爲鍵。例如,如果您的源地圖被定義爲Map<Integer, String>
創建地圖Map<String, List<Integer>>
。整數列表將包含具有特定值的鍵(來自您的源映射)。
是的Alex ..Mat也提出了同樣的想法。你可以給我代碼片段。我想它不會像我爲Mats評論所說的那樣工作。 – JavaUser 2011-12-18 08:32:01
基於Mat的答案,如果您需要頻繁地執行此操作,請使用來自Guava或Apache Commons Collections的雙向映射類之一;例如HashBiMap<K,V>
或DualHashBidiMap
或DualTreeBidiMap
。這些數據結構保持一對代表正向和反向映射的映射。
或者,對於一旦脫落計算:
Map.entries()
集合到一個數組。(這應該是O(NlogN)
的時間和要求O(N)
額外的空間...取決於所使用的排序算法。)
最基本的方法是:
HashMap
的密鑰,並遍歷映射檢查具有相同值的鍵。Vector
)。做完這些之後,你會最終得到你想要的。
編輯:代碼:
HashMap comp = new HashMap(); // Calculations Done
Vector v = new Vector(); // Temporary List To Store Keys
// Get The List Of Keys
Vector<Integer> keys = new Vector<Integer>();
Iterator<Integer> it = hm.keySet().iterator();
while(it.hasNext()) keys.add(it.next());
// For Every Key In Map...
for(int i = 0; i < hm.size(); i++) {
int key = keys.get(i);
v.add(key); // Add the Current Key To Temporary List
// Check If Others Exist
for(int j = i+1; j < hm.size(); j++) {
int nkey = keys.get(j);
if(hm.get(key).equals(hm.get(nkey))) {
v.add(nkey);
}
}
// Store The Value Of Current Key And The Keys In Temporary List In The Comp HashMap
String val = hm.get(key);
String cKey = "";
for(int x = 0; x < v.size(); x++)
cKey += v.get(x) + ",";
// Remove The Comma From Last Key, Put The Keys As Value And Value As Key
cKey = cKey.substring(0, cKey.length()-1);
comp.put(cKey, val);
// Clear The Temporary List
v.clear();
}
有這個代碼有點問題:重複發生,也是最後的重複似乎是正確的。
使用你的例子給出的輸出。 (你需要做一些格式化)。
{3=a,b, 6=c, 5=e,c, 2,5=e,c, 4=f, 1,3=a,b}
後至今你已經嘗試了代碼,並在那裏你堅持 – 2011-12-18 08:30:09