当值在 ArrayList 中时在 Map 中搜索键

Search for key in Map when the values are in ArrayList

我是Java中collections的新手,我有一个HashMap<String, List<String>>。我想在给定值时从 Map 中搜索键。

该地图将州的数据存储为键,将其城市的数据存储为列表。所以假设没有重复的键或值。

之前的一些回答指出了map中key-value的many:many和one:one关系的解决方案,但是我不明白如何检查List中的值.

我是否遍历整个地图并为每个键获取列表并在列表中搜索?或者还有其他方法吗?

请推荐一些方法。谢谢!

映射旨在允许使用键快速访问值。反之则需要您遍历所有值并寻找它。此外,您需要注意可以为多个键存储相同(或相等)的值。

为了有效地搜索给定城市名称的所有州,您可以使用一个逆映射,其中城市名称是键,值是州的集合(假设有多个城市,每个城市位于不同的州 - 例如,美国似乎有多个 Springfield)。

创建这种倒置地图的一种简单方法是使用 Guava 的 Multimap 作为初始地图(州 -> 城市),然后使用 Multimaps.invertFrom(intialMap);

编辑:参考 Brett Walker 的评论,Apache Commons Collections 的 BidiMap 似乎遵循类似的方法,即 AbstractDualBidiMap 实现在内部使用如上所述的两张地图。

我会使用 Apache Common Collection 库中的 BidiMap 作为起点。

对于 List<String> 部分,我会考虑使用 MultiValueMap,因为它装饰了另一张地图,允许它有多个键值。

我使用了 BidiMap 位而不是 MultiValueMap。我认为两者都有用。

你应该制作倒置地图(城市 -> 州地图)。

public Map<String, String> invertedMap(Map<String, List<String>> map) {
    Map<String, String> inverted = new HashMap<>();
    for (Entry<String, List<String>> e : map.entrySet())
        for (String city : e.getValue())
            inverted.put(city, e.getKey() /* state */);
    return inverted;
}