即使与具有相同值的另一个HashMap进行比较,HashMap values()。equals()也总是返回false

问题描述 投票:-4回答:2

我正在尝试使用hashMap.values()。equals()来检查两个哈希映射的值是否彼此相等。但即使两个HashMap具有相同的值,也不认为它是相等的。

String s = "egg";
String t = "add";
int count = 0;
HashMap<String,Integer> hashMap = new HashMap<>();

for (int i = 0; i < s.length(); i++) {
    String val = String.valueOf(s.charAt(i));

    if (!hashMap.containsKey(val)) {
        count++;
        hashMap.put(val, count);
    } else {
        hashMap.put(val, hashMap.get(val));
    }
}

HashMap<String,Integer> hashMap2 = new HashMap<>();
int count2 = 0;
for (int j = 0; j < t.length(); j++) {
    String val = String.valueOf(t.charAt(j));

    if (!hashMap2.containsKey(val)) {
        count2++;
        hashMap2.put(val, count2);
    } else{
        hashMap2.put(val, hashMap2.get(val));
    }
}

if (hashMap.values().equals(hashMap2.values())) {
    return true;
} else {
    return false;
}
java hashmap
2个回答
2
投票

您正在比较两个集合,它们永远不会相等,因为您在两个不同的集合上进行引用比较。 Apache commons-collections有CollectionUtils#isEqualCollection,使用它。当然,如果您创建自己的类作为映射的值,请在其中实现equals和hashCode。


2
投票

由于hashMap.values()返回Collection<T>,我们无法将它与equals()进行比较。感谢Ali Ben Zarrouk的帮助。以下是如何在不使用任何第三方库的情况下检查两个哈希映射的值是否相等的实现。

   if(areHashMapValuesEqual(hashMap.values(),hashMap2.values())){
        return true;
    } else {
        return false;
    }

  static <T> boolean areHashMapValuesEqual(Collection<T> lhs, Collection<T> rhs) {
    boolean equals = false;
    if(lhs!=null && rhs!=null) {
        equals = lhs.size( ) == rhs.size( ) && lhs.containsAll(rhs)  && rhs.containsAll(lhs);
    } else if (lhs==null && rhs==null) {
        equals = true;
    }
    return equals;
}
© www.soinside.com 2019 - 2024. All rights reserved.