![](/img/trans.png)
[英]how to implement a comparator for StringBuffer class in Java for use in TreeSet?
[英]How to implement a TreeSet in Java?
我正在实现一个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);
}
}
你可以加
if(name.equals(o.getName())) {
return 0;
}
在compareTo()
函数的开头。 这样,TreeSet可以假定a.equals(b)
等于a.compareTo(b) == 0
并且由于集合中的所有名称都不相同,因此您仍然可以按年龄排序。
你不能那样做。 等于和必须做“同一件事”。 也就是说,如果equals返回true,则compareTo应该返回0,反之亦然。
据我从TreeSet
的实现了解,它只能包含唯一元素。 为了将这些元素存储在TreeSet
,实现将使用compareTo()
方法将新元素与现有元素进行一次比较 。
您的代码当前在说- 人名相等,但年龄可比
我建议您更改equals()´,
compareTo() and
hashCode()`方法以考虑名称和年龄。
要按年龄对Person
对象进行排序,我建议使用ArrayList
并通过自定义Comparator
对其进行排序
根据Set
的定义(继承TreeSet
): http : TreeSet
:
集不包含元素对e1和e2,因此e1.equals(e2)
但是TreeSet
也必须(来自: http : //docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html ):
集合(无论是否提供显式比较器)维护的顺序必须与equals一致,才能正确实现Set接口
因此,您的compareTo()
方法应首先检查两个Person
是否通过name
equals()
,如果不是,则检查其age
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.