gpt4 book ai didi

java - TreeSet 未添加所有元素和 HashSet

转载 作者:行者123 更新时间:2023-12-02 05:39:10 24 4
gpt4 key购买 nike

我的代码中有两组,我在它们上添加相同的元素集合。问题是,TreeSet 没有添加所有元素。我有点困惑了。

我有一段时间遇到了一个问题,我正在努力找出为什么我的 TreeSet 不会添加我传递给 addAll 的 Collection 中的所有元素。

这是一个带有比较器的 TreeSet 构建,适用于具有 equals 方法的项目,例如:

public final boolean equals(Object o) {
return this==o;
}

@Override
public int hashCode() {
int hash = 3;
hash = 67 * hash + Objects.hashCode(this.grauDeAdaptacao);
hash = 67 * hash + Objects.hashCode(this.idade);
return hash;
}

为了测试我做了以下操作:

HashSet<Item> test1 = new HashSet<>(items);
TreeSet<Item> test2 = new TreeSet<>(getComparator());
test2.addAll(items);
if (test1.size() < 50 || test2.size()<50 ) {
throw new IllegalStateException();
}

比较器使用:

private int compare(S ser1, S ser2) {
return ser1.getGrau().compareTo(ser2.getGrau());
}

但尴尬的是,哈希接缝很好,而 TreeSet 没有全部 50 个元素。

我需要两个元素在所有子类中都是同一个实例时相等,这就是我创建这样的 final方法的原因。

最佳答案

HashSet 使用 equals 来测试两个对象是否相等。

HashSet 保证对于 Set 中的任意两个不同的对象 ab 来说,永远不会出现这种情况 a.equals(b) == true

TreeSet 使用 compareTo 来测试两个对象是否相等。

TreeSet 保证对于 Set 中的任何两个不同的对象 ab 来说,永远不会出现这种情况 a.compareTo(b) == 0

假设a.compareTo(b) == 0 iff a.equals(b) 那么这种行为是相同的。在这种情况下,可以说 compareTo 方法“与 equals 一致”,如 documentation for Comparable 中所定义。

同一文档还指出:

It is strongly recommended (though not required) that natural orderings be consistent with equals. This is so because sorted sets (and sorted maps) without explicit comparators behave "strangely" when they are used with elements (or keys) whose natural ordering is inconsistent with equals. In particular, such a sorted set (or sorted map) violates the general contract for set (or map), which is defined in terms of the equals method.

这是一个“行为“奇怪””的示例。

您有一些对象 a.equals(b) == false but a.compareTo(b) == 0

还应该注意的是,对于hashCode的实现,要求如果a.equals(b) == true然后a.hashCode() == b.hashCode()。您的实现中情况并非如此。鉴于您的 equals 实现,您的 hashCode() 实现无效。

自反属性不是必需的。即,可能(并且将会)出现 a.hashCode() == b.hashCode()a.equals(b) == false 的情况。

总而言之。

  1. 您的 hashCodeequals 是错误的。它们需要保持一致,如 equals 的文档中所述。和 hashCode .
  2. 您的 comapreTo 是错误的,它应该“与 equals 一致”,如 documentation for Comparable 中所述。 .

关于java - TreeSet 未添加所有元素和 HashSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24656874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com