【问题标题】:Comparing two hashmaps for equal values and same key sets?比较两个哈希图是否具有相同的值和相同的键集?
【发布时间】:2014-01-07 10:26:18
【问题描述】:

如何最好地比较两个HashMaps,如果我想知道它们是否包含不同的键,以及这些键的值是否相互匹配。

Map<objA, objB> mapA = new HashMap<objA, objB>();
mapA.put("A", "1");
mapA.put("B", "2");

Map<objA, objB> mapB = new HashMap<objA, objB>();
mapB.put("D", "4");
mapB.put("A", "1");

比较A和B时,应该会因为B和D的key不同而失败。

如何最好地比较未排序的哈希图?

【问题讨论】:

    标签: java collections hashmap comparison


    【解决方案1】:

    只需使用:

    mapA.equals(mapB);

    比较指定对象与此映射是否相等。返回真 如果给定的对象也是一个地图并且这两个地图代表相同 映射

    【讨论】:

    • 这是针对 Java 还是 Android 的?在 Android 上,equals 的描述为 different
    • @EdwardBrey 你所说的描述做同样的事情。我不知道你从哪里得到这个定义,因为它在 Android 文档上是一样的:developer.android.com/reference/java/util/…
    • 接口方法Map.equals的文档如您所引用。但是,HashMap 通过AbstractMap.equals 实现了该接口的equals 方法,它具有我引用的较弱的保证。 AbstractMap 代码与其文档相匹配。在我看来HashMap违反了接口的约定。
    • @EdwardBrey 然后告诉我你引用的内容的区别?因为我什么都看不到。它做同样的事情...... “这个实现首先检查对象的结构。如果它不是地图或不同大小,则返回false。否则它迭代它的自己的条目集,在对象中查找每个条目的键。如果任何不等于其他地图的same 键的值,返回 false。否则返回 true。"
    • 我担心它并没有说它迭代另一个条目集并以另一种方式进行查找。但是,正如您强调的那样,它会检查相同的大小,并且由于每个映射中的键必须是唯一的,因此不需要这样做。仅从一侧开始比较就足够了。
    【解决方案2】:
    /* JAVA 8 using streams*/
       public static void main(String args[])
        {
            Map<Integer, Boolean> map = new HashMap<Integer, Boolean>();
            map.put(100, true);
            map.put(1011, false);
            map.put(1022, false);
    
            Map<Integer, Boolean> map1 = new HashMap<Integer, Boolean>();
            map1.put(100, false);
            map1.put(101, false);
            map1.put(102, false);
    
            boolean b = map.entrySet().stream().filter(value -> map1.entrySet().stream().anyMatch(value1 -> (value1.getKey() == value.getKey() && value1.getValue() == value.getValue()))).findAny().isPresent();
            System.out.println(b);
        }
    

    【讨论】:

      【解决方案3】:

      keySet()keySet() 进行equals 检查。

      注意:

      如果您的 Map 包含 String 键,那没问题,但如果您的 Map 包含 objA 类型键,那么您需要确保您的类 objA 实现 equals()

      【讨论】:

      • 是的,但是 OP 也希望它们具有相同的映射。请注意,您还需要覆盖 hashCode。
      • 不要忘记覆盖hashCode(),如果你像那个家伙说的那样覆盖.equals()
      【解决方案4】:

      将 mapB 中的每个键与 mapA 中的对应键进行比较。然后检查mapA中是否有任何key在mapB中不存在

      public boolean mapsAreEqual(Map<String, String> mapA, Map<String, String> mapB) {
      
          try{
              for (String k : mapB.keySet())
              {
                  if (!mapA.get(k).equals(mapB.get(k))) {
                      return false;
                  }
              } 
              for (String y : mapA.keySet())
              {
                  if (!mapB.containsKey(y)) {
                      return false;
                  }
              } 
          } catch (NullPointerException np) {
              return false;
          }
          return true;
      }
      

      【讨论】:

      • 如果您的地图中有空值,这将不起作用。给定以下两个映射,比较会失败: final Map map1 = new HashMap(); map1.put("key1", new Double(0.0)); map1.put("key2", new Double(75.0)); map1.put("key3", null); final Map map2 = new HashMap(); map2.put("key1", Double.valueOf("0.0")); map2.put("key2", 75.0); map2.put("key3", null);
      【解决方案5】:
      public boolean compareMap(Map<String, String> map1, Map<String, String> map2) {
      
          if (map1 == null || map2 == null)
              return false;
      
          for (String ch1 : map1.keySet()) {
              if (!map1.get(ch1).equalsIgnoreCase(map2.get(ch1)))
                  return false;
      
          }
          for (String ch2 : map2.keySet()) {
              if (!map2.get(ch2).equalsIgnoreCase(map1.get(ch2)))
                  return false;
      
          }
      
          return true;
      }
      

      【讨论】:

        【解决方案6】:

        如果你有两张地图,比如说 map1 和 map2 然后使用 java8 Streams,我们可以使用下面的代码比较地图。但建议使用 equals 而不是 != 或 ==

        boolean b = map1.entrySet().stream().filter(value -> 
                    map2.entrySet().stream().anyMatch(value1 -> 
                    (value1.getKey().equals(value.getKey()) && 
          value1.getValue().equals(value.getValue())))).findAny().isPresent();   
        
        
        System.out.println("comparison  "+b);
        

        【讨论】:

          猜你喜欢
          • 2016-03-11
          • 1970-01-01
          • 2012-07-31
          • 2011-10-04
          • 2021-11-15
          • 1970-01-01
          • 2016-09-15
          • 2019-05-03
          • 2014-09-14
          相关资源
          最近更新 更多