我正在尝试理解树集。 为什么以下代码只打印
a不是b和c。
以下是代码:
Set<Person> tr = new TreeSet<Person>();
tr.add(new Person("a",1));
tr.add(new Person("c",7));
tr.add(new Person("5",5));
Iterator itr = tr.iterator();
while(itr.hasNext())
{
Person person = (Person) itr.next();
System.out.println(person.getName());
}
人类
package com.set;
public class Person implements Comparable<Person>{
private String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name , int age) {
this.name= name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public int compareTo(Person o) {
if(age > o.getAge() )
{
return 0;
}else{
return 1;
}
}
}
答案 0 :(得分:0)
仅当两个对象的年龄相等时才从compareTo()返回0
@覆盖
public int compareTo(Person o){
if(age == o.getAge() )
{
return 0;
}else{
return 1;
}
}
答案 1 :(得分:0)
这是一个正确的代码。要使用TreeSet
您的Person
类必须实现Comparable
接口(否则不会编译)。如果您的代码没有打印所有元素,则意味着您已经以某种方式实现了compareTo
方法,所有Person
个对象都被视为一个,所以
(new Person("a",1)).compareTo(new Person("c",7)) == 0
(new Person("a",1)).compareTo(new Person("5",5)) == 0
例如,如果您希望Person
通过其名称(String对象)进行标识,则可以将其写为
public class Person implements Comparable<Person>{
String name;
int age;
private Person(String name, int age) {
this.name=name;
this.age=age;
}
private String getName() {
return name;
}
@Override
public int compareTo(Person o) {
return name.compareTo(o.name);
}
}
打印出来
5
a
c
如果您希望将整个数据对用作标识符,那么使用HashSet
更合理(因为它只需要定义对象何时相等,而TreeSet
作为有序数据结构需要某种排序,您使用compareTo
方法声明。
答案 2 :(得分:0)
问题在于你的compareTo方法:
@Override
public int compareTo(Person o) {
if(age > o.getAge() )
{
return 0;
}else{
return 1;
}
}
TreeSet使用compareTo()来决定对象的相等性。当新对象年龄大于现有元素时,compareTo的实现将在所有情况下返回0。
答案 3 :(得分:0)
按年龄分类,您需要考虑它可能有所不同的两个方向。另外,为了使compareTo()
与equals保持一致,如果年龄相同,您也应该考虑名称。
@Override
public int compareTo(Person o) {
int ret = age - o.getAge();
if (ref == 0) {
return name.compareTo(o.getName());
}
return ret;
}
@Override
public boolean equals(Object o) {
if (o instanceof Person) {
Person p = (Person) o;
return p.getAge() == age && p.getName().equals(name);
}
return false;
}
答案 4 :(得分:0)
问题在于您的comapreTo
方法,请按此修改
@Override
public int compareTo(Person o) {
if(age == o.getAge() )
{
return 0;
}else if(age>o.getAge(){
return 1;
}else{
return -1;
}
}
根据java docs
comapreTo()方法将此对象与指定的对象进行比较以获得顺序。返回负整数,零或正整数,因为此对象小于,等于或大于指定对象。