如何在Java中实现树集?
我正在实现一个树集,它将根据人的年龄进行排序,但如果人的名字等于,则不会将人保存在集合中。我实现了equals和hashcode,但是这个集合将保存所有人,即使他们有相同的名字。我不知道为什么如何在Java中实现树集?,java,Java,我正在实现一个树集,它将根据人的年龄进行排序,但如果人的名字等于,则不会将人保存在集合中。我实现了equals和hashcode,但是这个集合将保存所有人,即使他们有相同的名字。我不知道为什么 public class Person implements Comparable<Person>{ private String name; private int age; public Person(String name, int age){
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);
}
}
公共类人员实现可比较{
私有字符串名称;
私人互联网;
公众人物(字符串名称,整数年龄){
this.name=名称;
这个。年龄=年龄;
}
@凌驾
公共内部比较(o人){
如果(this.getAge()您不能这样做。equals和compareTo必须做“相同的事情”。也就是说,如果equals返回true,compareTo应该返回0,反之亦然。您不能这样做。equals和compareTo必须做“相同的事情”也就是说,如果equals返回true,compareTo应该返回0,反之亦然。正如我从树集的实现中了解到的,它只能包含唯一的元素。要将这些元素存储在树集中,实现将使用compareTo()将新元素与现有元素进行一次比较
方法
您的代码当前的意思是-人在名字上是平等的,但仅在年龄上是可比的
我建议您更改equals()'、
compareTo()和
hashCode()`方法以考虑姓名和年龄
要按年龄对Person
对象进行排序,我建议使用数组列表
,并使用自定义的比较器对其进行排序,正如我从树集的实现中了解到的那样,它只能包含唯一的元素。要将这些元素存储在树集
,实现将比较新的元素使用compareTo()
方法与现有的一次
您的代码当前的意思是-人在名字上是平等的,但仅在年龄上是可比的
我建议您更改equals()'、
compareTo()和
hashCode()`方法以考虑姓名和年龄
要按年龄对人
对象进行排序,我建议使用数组列表
,并使用自定义的比较器对其进行排序
if(name.equals(o.getName())) {
return 0;
}
在compareTo()
函数的开头。这样TreeSet就可以假定a.equals(b)
等同于a.compareTo(b)==0
,并且仍然可以按年龄排序,因为集合中的所有名称都不同。您可以添加
if(name.equals(o.getName())) {
return 0;
}
在compareTo()
函数的开头。这样TreeSet就可以假定a.equals(b)
等同于a.compareTo(b)==0
,并且仍然可以按年龄排序,因为集合中的所有名称都不同。根据set
的定义(其中TreeSet
继承):
:
集合不包含e1和e2元素对,因此e1.equals(e2)
但是TreeSet
也必须(从:):
如果要正确实现set接口,set维护的顺序(无论是否提供显式比较器)必须与equals一致
因此,您的compareTo()
方法应该首先通过name
检查两个Person
是否等于
:
集合不包含e1和e2元素对,因此e1.equals(e2)
但是TreeSet
也必须(从:):
如果要正确实现set接口,set维护的顺序(无论是否提供显式比较器)必须与equals一致
因此,您的compareTo()
方法应该检查两个Person
是否相等()
首先按名称
,如果没有,请检查他们的年龄
是否有任何方法可以使用按年龄设置的排序元素,但可以按名称比较相同的元素?对树集使用自定义比较器
?比较器应首先按年龄进行比较,然后按名称进行比较-就是这样!是否有任何方法可以使用按年龄设置的排序元素,但不使用comp按名称是否为同一元素?对树集使用自定义比较器
?比较器应首先按年龄进行比较,然后按名称进行比较-就是这样!您的意思是set不能按年龄排序和按名称进行比较?您的意思是set不能按年龄排序和按名称进行比较?