获取这些密钥值相等的密钥列表

问题描述:

我需要获取密钥列表,其中值与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

你可以翻转你的哈希:建立与密钥类型是当前地图的值的类型的新的哈希,和值键入是您当前地图的关键字类型的列表。

迭代当前地图的按键,并将它们推送到新地图中的右侧插槽。然后你就会得到你所要求的映射。

如果您当前的地图中的值目前不能直接比较,那么您需要找到一个表示。这完全取决于数据的性质。
一种简单的方法是对列表进行排序,并使用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

您可以创建其他映射,其中您的键a用作值和值作为键。例如,如果您的源地图被定义为Map<Integer, String>创建地图Map<String, List<Integer>>。整数列表将包含具有特定值的键(来自您的源映射)。

+0

是的Alex ..Mat也提出了同样的想法。你可以给我代码片段。我想它不会像我为Mats评论所说的那样工作。 – JavaUser 2011-12-18 08:32:01

基于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. 获得第一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