我有一个散列映射。多个键具有相同的值。什么是最好的方式找到没有迭代的散列映射中常见值的返回键
keys for repeated Values
。 ?
阅读this文档它感觉没有它的功能。
注意:关键词|值对是Int类型的
我有一个散列映射。多个键具有相同的值。什么是最好的方式找到没有迭代的散列映射中常见值的返回键
keys for repeated Values
。 ?
阅读this文档它感觉没有它的功能。
注意:关键词|值对是Int类型的
不管怎样,您最终都会迭代该集合。迭代可能在某些库中被隐藏,但它肯定会在那里。
您可以轻松地编写一个简单的方法,做你所需要的:
public static <K,V> Set<K> keysOfDupValues(Map<K,V> m) {
Set<K> res = new HashSet<K>();
Map<V,K> seen = new HashMap<V,K>();
for (Map.Entry<K,V> e : m.entrySet()) {
V v = e.getValue();
K k = e.getKey();
if (seen.containsKey(v)) {
res.add(k);
res.add(seen.get(v));
} else {
seen.put(v, k);
}
}
return res;
}
仍然想知道,我有多个值相同的多个键。但我想我可以调整这一点。 – 2013-03-06 14:15:29
没有办法在没有在标准JDK API中迭代Map的情况下找到值的所有键。
可以使用番石榴库,或者通过:
真的不可能。在超类java.util.AbstractMap
中方法containsValue()
的执行非常重复遍历这些值。
所以,你必须通过价值观来实现这一点。
您可以查看implementation of containsValue()
以了解如何做到这一点。
如果您从代码中获得的地图读取无法控制,那么除了在地图上迭代外,您别无选择。
在任何情况下,您都可以通过构建反向映射来避免多次迭代的问题,该映射会归结为multimap,但由于在Java中没有针对该模式的特定类定义,因此必须构建它使用地图和列表。
您每次需要在原始地图中包含一对新对<k,v>
时,还需要在您的反向地图中包含反向对<v,k>
。如果v
作为关键字(即原始值)尚未存在于反向映射中,则将其映射到仅包含k
作为值(即原始关键字)的列表。如果密钥v
已经存在于反向映射中,那么只需将值k
推送到现有列表。
当您需要知道哪些键映射到原始映射中的给定值时,您可以查询反向映射中的值并获取键列表。
Java tutorial on maps包括使用地图实现多图的一节。
如果您能控制地图创建过程,此解决方案应该非常有效。但是,如果地图是由某种外部机制创建并定期更新的,那么收益会很小。
如果您只能控制地图的创建,但不能更新地图,您可以实现一个新类,公开Map
接口,该接口在内部保存反向地图,并在插入/移除新对时对其进行更新,或者支持通知机制让你的代码知道地图已经改变了,以及如何改变。
尝试改变
File newxmlfile = new File(Environment.getExternalStorageDirectory()
+ ts);
to
File newxmlfile = new File(Environment.getExternalStorageDirectory()
+ "/"+ts);
不反复?嗯..我会推荐一个水晶球。 – jrajav 2013-03-06 13:56:27
在这里看到http://stackoverflow.com/questions/1383797/java-hashmap-how-to-get-key-from-value – PSR 2013-03-06 13:59:06
@PSR我做过的问题,但我仍然没有找到一个函数回报我需要的东西。 – 2013-03-06 14:00:30