【问题标题】:HashMap values().equals() is always return false even if comparing with another HashMap which has same valueHashMap values().equals() 总是返回 false,即使与另一个具有相同值的 HashMap 比较
【发布时间】:2019-04-08 12:24:18
【问题描述】:

我正在尝试使用 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;
}

【问题讨论】:

  • 你想做什么?
  • 例如,我在两个哈希图中都有 [1, 2]。我在 if 语句之前检查。相同,但 if 语句总是返回 false。
  • hashMap.values() 不等于 hashMap2.values(),因为第一个是 [2,1,3],第二个是 [1,2,3]。 values 集合中的顺序由键的顺序决定,对于HashMap,它几乎是不可预测的。
  • @KlitosKyriacou 我被添加了错误的值。 s = "egg" 和 t = "add" 具有相同的值,但通过 .values().equals() 检查是不正确的,因为集合不能像 Ali Ben Zarrouk 指出的那样相等。感谢您的帮助。

标签: java hashmap


【解决方案1】:

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

【讨论】:

  • 这不是正确的答案。 OP 的代码使用equals(),而不是==。代码中没有参考比较。
  • @DodgyCodeException HashMap.values() 返回的Collection 没有覆盖equals,所以它使用默认实现,比较引用。
【解决方案2】:

由于hashMap.values() 是返回Collection&lt;T&gt;,我们无法将其与equals() 进行比较。感谢 Ali Ben Zarrouk 的帮助。下面是如何在不使用任何第三方库的情况下检查两个 hashmap 的值是否相等的实现。

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

【讨论】:

  • 这很好,但我会将该方法命名为 equalsIgnoreOrder。否则可能会造成混淆,因为List 接口中的同名equals 取决于顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-31
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多