在java中的同一循环中迭代两个hashmap的最佳方法是什么?

时间:2015-06-18 04:31:50

标签: java data-structures collections

将以下两张地图一起迭代的最佳方法是什么?我想比较两个映射值,它们是字符串,必须得到键和值。

HashMap<String, String> map1;
HashMap<String, String> map2;

4 个答案:

答案 0 :(得分:16)

确实没有比

更好的选择
for (Map.Entry<String, String> entry1 : map1.entrySet() {
  String key = entry1.getKey();
  String value1 = entry1.getValue();
  String value2 = map2.get(key); 
  // do whatever with value1 and value2 
}

答案 1 :(得分:4)

根据您尝试做的具体情况,有几个合理的选择:

  1. 只需比较两张地图的内容

    Guava提供了一个Maps.difference()实用程序,可以为您提供一个MapDifference实例,让您可以准确地检查两个地图之间的相同或不同。

  2. 同时迭代其条目

    如果您只是想同时迭代两张地图中的条目,那么它与迭代任何其他Collection没有什么不同。 This question详细介绍,但基本解决方案如下:

    Preconditions.checkState(map1.size() == map2.size());
    Iterator<Entry<String, String>> iter1 = map1.entrySet().iterator();
    Iterator<Entry<String, String>> iter2 = map2.entrySet().iterator();
    while(iter1.hasNext() || iter2.hasNext()) {
      Entry<String, String> e1 = iter1.next();
      Entry<String, String> e2 = iter2.next();
      ...
    }
    

    请注意,不保证这些条目的顺序相同(因此e1.getKey().equals(e2.getKey())可能是错误的。)

  3. 迭代他们的键配对他们的值

    如果您需要按键排列,请迭代两张地图的联合&#39;键:

    for(String key : Sets.union(map1.keySet(), map2.keySet()) {
      // these could be null, if the maps don't share the same keys
      String value1 = map1.get(key);
      String value2 = map2.get(key);
      ...
    }
    

答案 2 :(得分:0)

如果地图尺寸相同,我的情况是

IntStream.range(0, map1.size()).forEach(i -> map1.get(i).equals(map2.get(i));

答案 3 :(得分:-1)

for (String key : map1.keySet()) {
if (map2.containsKey(key)) {
        //do whatever
    } else{
          // they don't have same values for keys
    }
}