当值在 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;
}
我是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;
}