如何在Java中实现TreeSet?

时间:2012-04-12 06:14:51

标签: 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);
    }
}

4 个答案:

答案 0 :(得分:3)

您可以添加

if(name.equals(o.getName())) {
    return 0;
}

compareTo()函数的开头。这样,TreeSet可以假设a.equals(b)等同于a.compareTo(b) == 0,并且您仍然按年龄排序,因为集合中的所有名称都不同。

答案 1 :(得分:2)

你做不到。等于和比较必须做“同样的事情”。也就是说,如果equals返回true,则compareTo应返回0,反之亦然。

答案 2 :(得分:0)

据我理解TreeSet的实现,它只能包含唯一元素。要在TreeSet中存储这些元素,实现将使用compareTo()方法新元素与现有元素进行比较。

您的代码目前正在说 - Person名称相同,但只能按年龄进行比较

我建议您更改equals()´, compareTo()and hashCode()`方法以考虑名称和年龄。

要按年龄对Person个对象进行排序,我建议使用ArrayList并按自定义Comparator对其进行排序

答案 3 :(得分:0)

根据Set的定义(其中TreeSet继承): http://docs.oracle.com/javase/6/docs/api/java/util/Set.html

  

集合不包含元素对e1和e2,使得e1.equals(e2)

TreeSet也必须(来自:http://docs.oracle.com/javase/6/docs/api/java/util/TreeSet.html):

  

由集合维护的排序(无论是否提供显式比较器)必须与equals一致才能正确实现Set接口

因此,您的compareTo()方法应首先检查Person两个equals()name,如果不是age,请检查{{1}}。< / p>