如何按值比较两个地图

新手上路,请多包涵

如何按值比较两个地图?我有两个包含相等值的地图,想通过它们的值来比较它们。这是一个例子:

     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

我应该如何更改代码以获得真实的?

原文由 paweloque 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 357
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”} 的映射视为相等。 ..毕竟,价值集是平等的。

如果您可以更严格地定义您想要的内容,就可以更轻松地确保我们为您提供正确的答案。

原文由 Jon Skeet 发布,翻译遵循 CC BY-SA 3.0 许可协议

比较价值平等地图的正确方法是:

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

原文由 Donal Fellows 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题