【问题标题】:What is the best way to iterate two hashmap in same loop in java?在java中的同一个循环中迭代两个hashmap的最佳方法是什么?
【发布时间】:2015-09-03 13:39:08
【问题描述】:

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

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

【问题讨论】:

  • 匹配什么,两个hashmap中的插入顺序不会相同,因此无法逐个元素进行比较。要么先迭代,然后从第二个获取键值并进行比较
  • 是不是只需要比较maps的value,而不是keys??
  • 嗨 ankur /ParaSara,我必须比较两张地图中的值。
  • 也许您应该使用 LinkedHashMap,以便迭代器按插入顺序运行?

标签: java data-structures collections


【解决方案1】:

真的没有比这更好的选择了

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 
}

【讨论】:

  • 如果它们都是 LHM,并且你知道它们有相同的迭代顺序,你可以使用一对同步迭代器。
【解决方案2】:

你可以这样做:

for (String key : map1.keySet()) {
  if (map2.containsKey(key)) {
    // do whatever
  } else {
    // map2 doesn't have entry with map1 key
  }
}

【讨论】:

    【解决方案3】:

    根据您想要做什么,有几个合理的选择:

    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. 迭代它们的键以配对它们的值

      如果您需要键对齐,请遍历两个地图键的并集:

      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);
        ...
      }
      

    【讨论】:

      【解决方案4】:

      如果地图大小相同,我的情况

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

      【讨论】:

        猜你喜欢
        • 2017-01-14
        • 2011-10-01
        • 2018-02-16
        • 1970-01-01
        • 2016-04-07
        • 1970-01-01
        相关资源
        最近更新 更多