gpt4 book ai didi

java - 为什么树集找不到这个元素?

转载 作者:行者123 更新时间:2023-12-01 13:38:52 25 4
gpt4 key购买 nike

我有一个 Treeset,其中人们按照金钱进行排序,但平等是根据名称进行的。我有 jack 和杰基同名“杰基”,他们被认为是平等的。 jack 添加到了 Treeset,jackie 没有。contains() 上的 javadoc 说:

Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that (o==null ? e==null : o.equals(e)).

不幸的是这条线

System.out.println(peoples.contains(jackie));

当 jackie.equals(jack) 返回 true 时,返回 false。为什么?

这是完整的代码。

public class UsingSet {


public static void main(String[] args) {


People jo = new People("Jo");
People jack = new People("Jackie");
jack.setMoney(12);
People jim = new People("Jimmy");
jim.setMoney(150);
People john = new People("John");

TreeSet<People> peoples = new TreeSet<People>();
peoples.add(jo);
peoples.add(jack);
peoples.add(jim);
peoples.add(john);


People jackie = new People("Jackie");
System.out.println("equality ? "+(jackie.equals(jack)));
System.out.println(peoples.contains(jackie));

}
}

class People extends Object implements Comparable<People> {

public static long maxCount() {
return 25000000000L;
}

String name;
Float money = 1000f;

public People(String name) {
super();
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.length());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
People other = (People) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}

@Override
public String toString() {
return name;
}

@Override
public int compareTo(People other) {

int result = this.money.compareTo(other.getMoney());
if (result == 0){
//finding a second criteria
return this.name.compareTo(other.getName());
}else{
return result;
}
}


public float getMoney() {
return money;
}

public void setMoney(float money) {
this.money = money;
}

}
<小时/>

编辑:javadoc 表示,基于自然顺序的 Treeset 必须具有与 compareTo() 一致的 equals() 。带有 Comparator 的 Treeset 不能。

所以我稍微修改了代码:

Comparator<People> compareByMoney = new Comparator<People>() {

@Override
public int compare(People p1, People p2) {
int result = p1.money.compareTo(p2.getMoney());
if (result == 0){
//finding a second criteria
return p1.name.compareTo(p2.getName());
}else{
return result;
}
}

};

TreeSet<People> peoples = new TreeSet<People>(compareByMoney);
...
System.out.println(peoples.contains(jackie)); //--> true

最佳答案

jackie 并不正式等于 jack,因为他们没有相同数量的钱(请注意,您的 equals 方法仅检查名称,而不检查钱)。

您正在使用金钱属性来比较树集中的它们。由于 jackie 有 1000 个钱,而 jack 有 12 个,因此它们对于树集来说并不相同,因此包含 return false..

如果你这样做

People jackie = new People("Jackie");
jackie.setMoney(12);

您会发现它对两者都输出 true,或者如果您的 compareTo 方法只是:

    @Override
public int compareTo(People other) {
return this.name.compareTo(other.getName());
}

它还会输出true

因此,您需要更改 equals 方法来比较 money 金额,或者仅使用 compareTo 方法中的名称。

如果您阅读了文档:

Note that the ordering maintained by a set (whether or not an explicit comparator is provided) must be consistent with equals if it is to correctly implement the Set interface. (See Comparable or Comparator for a precise definition of consistent with equals.) This is so because the Set interface is defined in terms of the equals operation, but a TreeSet instance performs all element comparisons using its compareTo (or compare) method, so two elements that are deemed equal by this method are, from the standpoint of the set, equal

一致:

The natural ordering for a class C is said to be consistent with equals if and only if e1.compareTo(e2) == 0 has the same boolean value as e1.equals(e2) for every e1 and e2 of class C

通过您的代码,我们有:

System.out.println("equality ? "+(jackie.equals(jack))); //equality ? true
System.out.println(jackie.compareTo(jack)); //1

您的类(class)的自然顺序与 equals 不一致。因此,不要指望您的 treeSet 具有正常行为。

关于java - 为什么树集找不到这个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21015833/

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