繁体   English   中英

如何在Java中实现TreeSet?

[英]How to implement a TreeSet in 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);
    }
}

你可以加

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

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

你不能那样做。 等于和必须做“同一件事”。 也就是说,如果equals返回true,则compareTo应该返回0,反之亦然。

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

您的代码当前在说- 人名相等,但年龄可比

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

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

根据Set的定义(继承TreeSet ): http : TreeSet

集不包含元素对e1和e2,因此e1.equals(e2)

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

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

因此,您的compareTo()方法应首先检查两个Person是否通过name equals() ,如果不是,则检查其age

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM