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