检索 ArrayListMultimap 键
-
20-09-2019 - |
题
我用的是番石榴 ArrayListMultimap<K,V>
集合到地图 Integers
到 Strings
. 。该类提供了一个方法,称为 containsValue(Object value)
它检查 Multimap 是否包含任何键的指定值。一旦我确定这是真的,检索所述密钥的最佳方法是什么?
ArrayListMultimap<String, Integer> myMap = ArrayListMultimap.create();
if (myMap.containsValue(new Integer(1))
{
// retrieve the key?
}
解决方案
而不是使用 containsValue
你可以迭代 myMap.entries() 它返回所有键值对的集合。返回的集合生成的迭代器会遍历一个键的值,然后遍历第二个键的值,依此类推:
Integer toFind = new Integer(1);
for (Map.Entry<String, Integer> entry: myMap.entries()) {
if (toFind.equals(entry.getValue())) {
// entry.getKey() is the first match
}
}
// handle not found case
如果你看一下实施 containsValue
它只是迭代地图的值,因此执行此操作的性能 map.entries()
代替 map.values()
应该是差不多的。
public boolean containsValue(@Nullable Object value) {
for (Collection<V> collection : map.values()) {
if (collection.contains(value)) {
return true;
}
}
return false;
}
当然,在一般情况下,给定值不一定有唯一的键,因此除非您知道在映射中每个值仅针对单个键出现,否则您需要指定行为,例如如果您想要第一个键或最后一个键。
不隶属于 StackOverflow