2015-06-16 25 views
-2

我是Java新手,我有一个HashMap<String, List<String>>。当我给出一个值时,我想从Map中搜索一个键。在ArrayList中查找映射中的键值

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

一些以前的答案指出了很多方面的解决方案:许多和一个:关键值在地图中的一个关系,但我不明白如何检查List中的值。

我是否遍历整个地图并为每个键获取列表并在列表中搜索?或者有没有其他的方式来做到这一点?

请建议一些方法。谢谢!

+1

查看Apache Common Collection库。他们有一个“双向映射”(BidiMap) - 一个双向映射和一个“MultiValueMap” - 装饰另一个映射,允许它有一个以上的值。这些和其他可能有用或兴趣。 –

+0

@BrettWalker谢谢你的回应,我们不能使用java api的相同吗?我想避免使用任何额外的库。 – HitchHiker

+0

我可以理解,如果可以避免的话,不想包含额外的库。但是,我疯狂的两个建议并不是微不足道的,你所要求的是在Java Collections中找不到的。 –

回答

1

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

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; 
} 
+0

谢谢你的解决方案!我现在正在尝试它,我希望这会使任务更容易:) – HitchHiker

+0

@vaishnavee如果两个州有相同的城市名称,倒映图必须是Map >。小心! – saka1029

+0

是的,这将主要是这种情况,我将不得不为它处理一些通用数据,但在我的应用程序中没有必要,因为肯定没有重复:)并且解决方案运行顺利!谢谢 – HitchHiker

0

地图旨在允许通过使用密钥快速访问值。反过来,要求你遍历所有值并寻找它。此外,您需要知道,可以为多个键存储相同(或相等)的值。

为了有效地搜索给定城市名称的所有状态,您可以使用一个反向地图,其中城市名称是关键字,值是州的集合(假设有几个城市各自处于不同的状态 - 例如在美国似乎有多个Springfield)。

一个简单的方法来创建这样一个倒转的地图将使用番石榴的Multimap的初始地图(州 - >城市),然后使用Multimaps.invertFrom(intialMap);

编辑:在参考布雷特·沃克的评论,阿帕奇百科全书集合BidiMap似乎遵循了类似的做法,即AbstractDualBidiMap实现内部使用两张地图,如上所述。

+0

我觉得这个问题可能有助于OP:http://stackoverflow.com/questions/1383797/java-hashmap-how-to-get-key -from-value – Adam

+0

@Thomas感谢您的回应,我已经说过,我正在处理的数据中没有重复键值。是不是只能使用Java Collection API? – HitchHiker

+0

@WhyCry是的,这是我所指的相同的答案,但它没有解释清单值部分 – HitchHiker

0

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

对于List<String>部分,我会考虑使用MultiValueMap,因为它装饰另一个地图,允许它为一个键有多个值。我已经使用BidiMap位而不是MultiValueMap。我在想这两者都会有用。