0

我试图了解树集。为什么下面的代码只打印

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;
            }

    }


}
4

5 回答 5

0

仅当两个对象的年龄相等时才从您的 compareTo() 返回 0

@覆盖

公共 int compareTo(Person o) {

    if(age == o.getAge() )
    {
        return 0;
    }else{
        return 1;
    }

}

于 2013-08-10T06:50:18.300 回答
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通过他们的名字(字符串对象)来识别,这可以写成

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方法。

于 2013-08-10T06:56:36.867 回答
0

问题出在您的 compareTo 方法上:

@Override
public int compareTo(Person o) {

        if(age > o.getAge() )
        {
            return 0;
        }else{
            return 1;
        }

}

TreeSet 使用 compareTo() 来决定对象的相等性。当新对象年龄大于现有元素时,您的 compareTo 实现将在所有情况下返回 0。

于 2013-08-10T06:57:38.683 回答
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;
}
于 2013-08-10T07:00:49.887 回答
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文档

comapreTo() 方法 将此对象与指定对象进行比较以进行排序。返回负整数、零或正整数,因为此对象小于、等于或大于指定对象。

于 2013-08-10T07:03:22.853 回答