如何按值比较两个地图

2022-09-04 23:48:22

如何按值比较两张地图?我有两个包含相等值的地图,并希望通过它们的值来比较它们。下面是一个示例:

    Map a = new HashMap();
    a.put("foo", "bar"+"bar");
    a.put("zoo", "bar"+"bar");

    Map b = new HashMap();
    b.put(new String("foo"), "bar"+"bar");
    b.put(new String("zoo"), "bar"+"bar");

    System.out.println("equals: " + a.equals(b));            // obviously false

我应该如何更改代码以获得 true?


答案 1

比较映射值相等的正确方法是:

  1. 检查地图的大小是否相同(!)
  2. 从一个地图获取密钥
  3. 对于您检索到的该集中的每个键,请检查从该键的每个映射中检索到的值是否相同(如果一个映射中没有该键,则表示完全相等)

换句话说(减去错误处理):

boolean equalMaps(Map<K,V>m1, Map<K,V>m2) {
   if (m1.size() != m2.size())
      return false;
   for (K key: m1.keySet())
      if (!m1.get(key).equals(m2.get(key)))
         return false;
   return true;
}

答案 2

使用串联构造不同字符串的尝试将在编译时执行时失败。这两个地图都有一对;每对将“foo”和“barbar”作为键/值,两者都使用相同的字符串引用。

假设您真的想在没有任何键引用的情况下比较值集,则只是以下情况:

Set<String> values1 = new HashSet<>(map1.values());
Set<String> values2 = new HashSet<>(map2.values());
boolean equal = values1.equals(values2);

比较 可能会起作用 - 但也有可能在相等比较中使用它们返回的顺序,这不是你想要的。map1.values()map2.values()

请注意,使用集合有其自身的问题 - 因为上面的代码会认为{“a”:“0”,“b”:“0”}和{“c”:“0”}的映射是相等的...毕竟,值集是相等的。

如果你能提供一个更严格的定义,你想要什么,那就更容易确保我们给你正确的答案。