LinkedHashMap如何通过值查找键?

4
在一个链接的哈希映射中,是否有一种方法只提供V就能获取K的值? 我已经在互联网上搜索了很久,到目前为止我只找到了通过循环获取键的方法。

我认为除了循环之外,你别无选择。 - Mike Lin
4
这里有你所寻找的答案。 - Dan675
值不能是唯一的...因此有可能会为相同的值获取多个键..... - Shashank Kadne
3个回答

4

不是通过V来找K,而是通过K来关联V,这就是Map的意义。你需要逐一遍历每个K/V对(使用循环)。

如果这是一个常见的操作,你可能需要创建第二个Map以实现反向查询(可能要用一个类将两个Map封装起来)。当然,如果你不考虑唯一性,这会有些棘手。


2

没有比使用普通的 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),您可以查找与值关联的所有键。


1
一个Map不应该被这种方式使用,详见@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
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接