我正在使用Guava的ArrayListMultimap<K,V>
集合将Integers
映射到Strings
。该类提供了一个名为containsValue(Object value)
的方法,该方法检查Multimap是否包含任何键的指定值。一旦我确定这是真的,检索所述密钥的最佳方法是什么?
ArrayListMultimap<String, Integer> myMap = ArrayListMultimap.create();
if (myMap.containsValue(new Integer(1))
{
// retrieve the key?
}
答案 0 :(得分:3)
您可以迭代myMap.entries()而不是使用containsValue
,它会返回所有键值对的集合。返回集合生成的迭代器遍历一个键的值,后跟第二个键的值,依此类推:
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;
}
在一般情况下,当然不一定是给定值的唯一键,因此,除非您知道在地图中每个值仅针对单个键发生,否则您需要指定行为,例如如果你想要第一把钥匙或最后一把钥匙。