2011-12-18 111 views
0

我需要獲取密鑰列表,其中值與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

+0

後至今你已經嘗試了代碼,並在那裏你堅持 – 2011-12-18 08:30:09

回答

3

你可以翻轉你的哈希:建立與密鑰類型是當前地圖的值的類型的新的哈希,和值鍵入是您當前地圖的關鍵字類型的列表。

迭代當前地圖的按鍵,並將它們推送到新地圖中的右側插槽。然後你就會得到你所要求的映射。

如果您當前的地圖中的值目前不能直接比較,那麼您需要找到一個表示。這完全取決於數據的性質。
一種簡單的方法是對列表進行排序,並使用toString表示作爲新密鑰。這僅適用於基礎對象的toString表示法爲此目的而合理。

+0

THX墊..我也想到這一點,但是在這種情況下,關鍵本身就是一個列表,將這樣的工作方式。即使密鑰具有相同的值,密鑰也會被視爲不同的值。您可以提供代碼片段嗎? – JavaUser 2011-12-18 08:28:54

+0

列表中的鍵或_values_(您當前的地圖)是? – Mat 2011-12-18 08:32:32

+0

當前HashMap的值是一個列表 – JavaUser 2011-12-18 08:38:08

1

您可以創建其他映射,其中您的鍵a用作值和值作爲鍵。例如,如果您的源地圖被定義爲Map<Integer, String>創建地圖Map<String, List<Integer>>。整數列表將包含具有特定值的鍵(來自您的源映射)。

+0

是的Alex ..Mat也提出了同樣的想法。你可以給我代碼片段。我想它不會像我爲Mats評論所說的那樣工作。 – JavaUser 2011-12-18 08:32:01

1

基於Mat的答案,如果您需要頻繁地執行此操作,請使用來自Guava或Apache Commons Collections的雙向映射類之一;例如HashBiMap<K,V>DualHashBidiMapDualTreeBidiMap。這些數據結構保持一對代表正向和反向映射的映射。

或者,對於一旦脫落計算:

  1. 提取Map.entries()集合到一個數組。
  2. 按值的順序排列數組。
  3. 迭代數組,並提取後續條目值相等的條目鍵。

(這應該是O(NlogN)的時間和要求O(N)額外的空間...取決於所使用的排序算法。)

+0

我只能使用那些APIS – JavaUser 2011-12-18 08:34:25

+0

Stephen。這是一次性操作。 – JavaUser 2011-12-18 08:44:54

+0

@JavaUser - 在這種情況下,這裏有更多提示。 1)'Collection' API中有一個方法將元素複製到一個數組中。 2)'Arrays'類有一個靜態方法來對一個數組進行排序。 3)您將需要創建並使用自定義的「比較器」對數組進行排序。 – 2011-12-18 10:16:10

1

最基本的方法是:

  1. 獲得第一HashMap的密鑰,並遍歷映射檢查具有相同值的鍵。
  2. 如果找到,從地圖中刪除該密鑰並將密鑰存儲在另一個集合中(可能是Vector)。
  3. 然後,在檢查完所有其他密鑰後,將當前密鑰添加到該集合。
  4. 如果找不到其他鍵,則將當前鍵添加到該集合。
  5. 然後將該集合中的鍵添加到具有相關值的另一個映射。清除收集。
  6. 繼續下一個鍵,並執行相同操作。

做完這些之後,你會最終得到你想要的。

編輯:代碼:

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} 
+0

酷..它應該工作..有代碼片段? – JavaUser 2011-12-18 08:36:52

+1

這是'O(N^2)',它破壞了原始的'HashMap'。 – 2011-12-18 08:42:22

+0

@StephenC嗯,究竟是'O(N^2)'?我認爲它與算法有關,但究竟是什麼呢? – Roshnal 2011-12-18 09:22:42