链接的hashmap按值查找键?

时间:2012-03-02 04:22:49

标签: java hashmap key

在链接的hashmap中 是否有任何方法只通过提供V来获得K的值? 我在互联网上搜索过,到目前为止我只找到了获取密钥的循环。

3 个答案:

答案 0 :(得分:4)

没有

地图的要点是将V与特定的K相关联,而不是相反。您必须线性地遍历每个K / V对(您的循环)。

如果这是一个常见的操作,你需要创建另一个方向的第二个映射(并且可能将它们包装在一个抽象出来的类中)。当然,如果你不是在讨论独特的价值观,那就太难了。

答案 1 :(得分:1)

地图不打算以这种方式使用,请参阅@Brian Roach的回答。您应该考虑用其他东西替换该Map,或者考虑反转其键/值。

无论如何,你可以通过这种方式找到对应于valueToFind的键:

if (map.containsValue(valueToFind)) {
    for (final Object /* whatever you use, your 'K' type */ entry : map.keySet()) {
        if (map.get(entry) == valueToFind) {
            //You found one key containing valueToFind
            //Keep searching, there may be others
        }
    }
}

答案 2 :(得分:1)

没有任何东西比带有香草LinkedHashMap的循环更好,但这里有一些Guava的替代品......

如果您知道自己的值是唯一的,则BiMap API可以有效地支持逆查找,而无需手动维护向后的地图。使用HashBiMap作为您的实现,您可以使用bimap.inverse().get(value)从值中查找密钥。

如果您的值不是唯一,则可能会构建一个Multimap,将每个值映射到其每个关联的键。您可以使用

快速完成此操作
Multimap<V, K> reverse = Multimaps.invertFrom(
  Multimaps.forMap(map),
  HashMultimap.<V, K> create());

可让您使用reverse.get(value)查找与值关联的所有键。