我正在实现一个TreeSet,它将按人的年龄排序,但是如果一个人的名字是等于的,那么一个人就不会被保存在集合中。我实现了equals和hashcode,但是这个集合即使它们具有相同的名称也会保存所有人。我不知道为什么。
public class Person implements Comparable<Person>{
private String name;
private int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person o) {
if(this.getAge()<o.getAge()){
return -1;
}
return this.getAge() == o.getAge()?0:1;
}
@Override
public boolean equals(Object object){
return name.equals(((Person)object).getName());
}
@Override
public int hashCode(){
return name.hashCode();
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public static void main(String[] args){
Set<Person> set = new TreeSet<Person>();
set.add(new Person("Jack",30));
set.add(new Person("Jack",20));
System.out.println(set);
}
}
答案 0 :(得分:3)
您可以添加
if(name.equals(o.getName())) {
return 0;
}
在compareTo()
函数的开头。这样,TreeSet可以假设a.equals(b)
等同于a.compareTo(b) == 0
,并且您仍然按年龄排序,因为集合中的所有名称都不同。
答案 1 :(得分:2)
你做不到。等于和比较必须做“同样的事情”。也就是说,如果equals返回true,则compareTo应返回0,反之亦然。
答案 2 :(得分:0)
据我理解TreeSet
的实现,它只能包含唯一元素。要在TreeSet
中存储这些元素,实现将使用compareTo()
方法将新元素与现有元素进行比较。
您的代码目前正在说 - Person名称相同,但只能按年龄进行比较
我建议您更改equals()´,
compareTo()and
hashCode()`方法以考虑名称和年龄。
要按年龄对Person
个对象进行排序,我建议使用ArrayList
并按自定义Comparator
对其进行排序
答案 3 :(得分:0)
根据Set
的定义(其中TreeSet
继承):
http://docs.oracle.com/javase/6/docs/api/java/util/Set.html:
集合不包含元素对e1和e2,使得e1.equals(e2)
但TreeSet
也必须(来自:http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html):
由集合维护的排序(无论是否提供显式比较器)必须与equals一致才能正确实现Set接口
因此,您的compareTo()
方法应首先检查Person
两个equals()
是name
,如果不是age
,请检查{{1}}。< / p>