我有一个哈希图。多个键具有相同的值。什么是最好的方法来找到
keys for repeated Values
无需迭代。?
阅读这个文档感觉它没有任何功能。
注意:键 | 值对是 Int 类型
如果不迭代标准 JDK API 中的 Map,就无法找到一个值的所有键。
您可以通过以下方式使用 Guava 库:
无论哪种方式,您最终都会迭代集合。在某些库中,迭代可能隐藏在视图之外,但它必然存在。
您可以轻松编写一个简单的方法来满足您的需求:
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;
}
这真的不可能。containsValue()
超类中 method 的实现java.util.AbstractMap
会遍历这些值。
所以,你必须通过价值观来实现这一目标。
您可以查看实现containsValue()
以了解如何执行此操作。
如果您从无法控制的代码中读取该地图,那么您别无选择,只能在地图上进行迭代。
在任何情况下,您都可以通过构建一个反向映射来避免进行多次迭代的问题,这将归结为一个多重映射,但是由于 Java 中没有该模式的特定类定义,您必须使用映射来构建它和清单。
每次您需要<k,v>
在原始映射中包含一个新对时,您还需要<v,k>
在反向映射中包含反向对。如果v
作为键(即原始值)在反向映射中尚不存在,则将其映射到仅包含k
作为值(即原始键)的列表。如果键v
已经存在于反向映射中,那么您只需将值推k
送到现有列表中。
当您需要知道哪些键映射到原始映射中的给定值时,您可以在反向映射中查询该值,并获取键列表。
关于地图的Java 教程包括一个关于使用地图实现多地图的部分。
如果您可以控制地图创建过程,此解决方案应该非常有效。但是,如果地图是由某种外部机制创建并定期更新的,那么它的收益将很小。
如果您只能控制映射的创建,但不能控制其更新,您可以实现一个暴露Map
接口的新类,该接口在内部也保存反向映射,并在插入/删除新对时更新它,或支持通知让您的代码知道地图已更改以及如何更改的机制。
尝试改变
File newxmlfile = new File(Environment.getExternalStorageDirectory()
+ ts);
to
File newxmlfile = new File(Environment.getExternalStorageDirectory()
+ "/"+ts);