Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HashMap values().equals()始终返回false,即使与具有相同值的另一个HashMap进行比较_Java_Hashmap - Fatal编程技术网

Java HashMap values().equals()始终返回false,即使与具有相同值的另一个HashMap进行比较

Java HashMap values().equals()始终返回false,即使与具有相同值的另一个HashMap进行比较,java,hashmap,Java,Hashmap,我试图使用hashMap.values.equals检查两个hashMap的值是否相等。但即使两个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 = Str

我试图使用hashMap.values.equals检查两个hashMap的值是否相等。但即使两个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;
}

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

因为hashMap.values是返回集合,所以我们无法将其与equals进行比较。感谢阿里·本·扎鲁克的帮助。下面是如何在不使用任何第三方库的情况下检查两个哈希映射的值是否相等的实现

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

您想做什么?例如,我在两个哈希映射中都有[1,2]。我先检查一下是否有声明。这是相同的,但if语句总是返回false。hashMap.values的可能重复项不等于hashMap2.values,因为第一个是[2,1,3],第二个是[1,2,3]。值集合中的顺序由键的顺序决定,在HashMap的情况下,它实际上是不可预测的。@KlitosKyriacou I添加了错误的值。s=egg和t=add具有相同的值,但检查via.values.equals是不正确的,因为集合不能像Ali Ben Zarrouk指出的那样相等。谢谢你的帮助。这不是正确的答案。OP的代码使用等于,而不是==。代码中没有引用比较。@DodgyCodeException HashMap.values返回的集合不重写equals,因此它使用默认实现来比较引用。这很好,但我将该方法命名为equalsIgnoreOrder。否则可能会造成混淆,因为列表界面中的相同名称equals取决于顺序。