为什么迭代器没有获取剩余的对象?

时间:2013-08-10 06:41:16

标签: java collections tree treeset

我正在尝试理解树集。 为什么以下代码只打印

  

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

    }


}

5 个答案:

答案 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()方法将此对象与指定的对象进行比较以获得顺序。返回负整数,零或正整数,因为此对象小于,等于或大于指定对象。