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
比较地图的价值平等的正确方法是:
换句话说(减去错误处理):
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)
您尝试使用串联构造不同的字符串将失败,因为它是在编译时执行的.这两张地图都有一对; 每对都将使用"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"}的映射相等.毕竟,价值集是相等的.
如果你能对你想要的东西提供更严格的定义,那么确保我们给你正确答案会更容易.
要查看两个地图是否具有相同的值,您可以执行以下操作:
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)