如何根据值来比较两个地图

paw*_*que 12 java collections dictionary compare equals

如何按价值比较两张地图?我有两个包含相等值的地图,并希望通过它们的值进行比较.这是一个例子:

    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
Run Code Online (Sandbox Code Playgroud)

[[ 编辑:有人请编辑并修复此问题,以表示其实际意味着什么.上面的代码打印"true",而不是"false".]]

显然,要实现比较并不困难,只需比较所有键及其相关值即可.我不相信我是第一个这样做的人,所以必须已经有一个库函数在java或jakarta.commons库中.

谢谢

Don*_*ows 35

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

  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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这与`Map.equals`有什么不同? (7认同)

Jon*_*eet 8

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

假设您确实想要比较值集而不引用任何键,那么它只是一个例子:

Set<String> values1 = new HashSet<>(map1.values());
Set<String> values2 = new HashSet<>(map2.values());
boolean equal = values1.equals(values2);
Run Code Online (Sandbox Code Playgroud)

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

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

如果你能对你想要的东西提供更严格的定义,那么确保我们给你正确答案会更容易.


pol*_*nts 6

要查看两个地图是否具有相同的值,您可以执行以下操作:

  • 得到他们的Collection<V> values()意见
  • 换入 List<V>
  • Collections.sort 那些清单
  • 测试两个列表是否 equals

像这样的东西工作(虽然它的类型边界可以改进):

static <V extends Comparable<V>>
boolean valuesEquals(Map<?,V> map1, Map<?,V> map2) {
    List<V> values1 = new ArrayList<V>(map1.values());
    List<V> values2 = new ArrayList<V>(map2.values());
    Collections.sort(values1);
    Collections.sort(values2);
    return values1.equals(values2);
}
Run Code Online (Sandbox Code Playgroud)

测试工具:

Map<String, String> map1 = new HashMap<String,String>();
map1.put("A", "B");
map1.put("C", "D");

Map<String, String> map2 = new HashMap<String,String>();
map2.put("A", "D");
map2.put("C", "B");

System.out.println(valuesEquals(map1, map2)); // prints "true"
Run Code Online (Sandbox Code Playgroud)

这是O(N log N)由于Collections.sort.

也可以看看:


测试密钥是否相等更容易,因为它们是Set<K>:

map1.keySet().equals(map2.keySet())
Run Code Online (Sandbox Code Playgroud)

也可以看看: