答案 0 :(得分:0)
如果没有在标准JDK API中迭代Map,就无法找到值的所有键。
您可以通过以下方式使用Guava库:
答案 1 :(得分:0)
不管怎样,你最终都会迭代这个集合。在某些库中,迭代可能会被隐藏,但它必然存在。
您可以轻松编写一个能够满足您需求的简单方法:
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;
}
答案 2 :(得分:0)
这真的不可能。超类containsValue()
中方法java.util.AbstractMap
的实现迭代了值。
所以,你必须通过这些值来实现这一点。
您可以查看implementation of containsValue()
以了解如何执行此操作。
答案 3 :(得分:0)
如果您从无法控制的代码中获取该地图,那么除了在地图上进行迭代之外别无选择。
在任何情况下,您都可以通过构建反向映射来避免执行多次迭代的问题,反向映射将归结为多图,但由于Java中没有针对该模式的特定类定义,因此您必须构建它使用地图和清单。
每次您需要在原始地图中添加新对<k,v>
时,您还需要在反向地图中包含反向对<v,k>
。如果反向映射中尚不存在v
作为键(即原始值),则将其映射到仅包含k
作为值的列表(即原始键)。如果反向地图中已存在密钥v
,则只需将值k
推送到现有列表。
当您需要知道哪些键映射到原始地图中的给定值时,您将在反向映射中查询该值,并获取键列表。
Java tutorial on maps包含有关使用地图实施多地图的部分。
如果您可以控制地图创建过程,此解决方案应该非常有效。但是,如果地图是由一些外部机制创建并定期更新的,那么它将获得很少的收益。
如果你只能控制地图的创建,而不是它的更新,你可以实现一个暴露Map
接口的新类,它在内部保存反向地图,并在新的一对时更新它。插入/删除,或支持通知机制,让您的代码知道地图已被更改以及如何更改。
答案 4 :(得分:0)
尝试更改
File newxmlfile = new File(Environment.getExternalStorageDirectory()
+ ts);
to
File newxmlfile = new File(Environment.getExternalStorageDirectory()
+ "/"+ts);