Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中实现树集?_Java - Fatal编程技术网

如何在Java中实现树集?

如何在Java中实现树集?,java,Java,我正在实现一个树集,它将根据人的年龄进行排序,但如果人的名字等于,则不会将人保存在集合中。我实现了equals和hashcode,但是这个集合将保存所有人,即使他们有相同的名字。我不知道为什么 public class Person implements Comparable<Person>{ private String name; private int age; public Person(String name, int age){

我正在实现一个树集,它将根据人的年龄进行排序,但如果人的名字等于,则不会将人保存在集合中。我实现了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);
    }
}
公共类人员实现可比较{
私有字符串名称;
私人互联网;
公众人物(字符串名称,整数年龄){
this.name=名称;
这个。年龄=年龄;
}
@凌驾
公共内部比较(o人){

如果(this.getAge()您不能这样做。equals和compareTo必须做“相同的事情”。也就是说,如果equals返回true,compareTo应该返回0,反之亦然。

您不能这样做。equals和compareTo必须做“相同的事情”也就是说,如果equals返回true,compareTo应该返回0,反之亦然。

正如我从
树集的实现中了解到的,它只能包含唯一的元素。要将这些元素存储在
树集中,实现将使用
compareTo()将新元素与现有元素进行一次比较
方法

您的代码当前的意思是-人在名字上是平等的,但仅在年龄上是可比的

我建议您更改
equals()'、
compareTo()
hashCode()`方法以考虑姓名和年龄


要按年龄对
Person
对象进行排序,我建议使用
数组列表
,并使用自定义的
比较器对其进行排序,正如我从
树集的实现中了解到的那样,它只能包含唯一的元素。要将这些元素存储在
树集
,实现将比较新的元素使用
compareTo()
方法与现有的一次

您的代码当前的意思是-人在名字上是平等的,但仅在年龄上是可比的

我建议您更改
equals()'、
compareTo()
hashCode()`方法以考虑姓名和年龄

要按年龄对
对象进行排序,我建议使用
数组列表
,并使用自定义的
比较器对其进行排序

if(name.equals(o.getName())) {
    return 0;
}
compareTo()
函数的开头。这样TreeSet就可以假定
a.equals(b)
等同于
a.compareTo(b)==0
,并且仍然可以按年龄排序,因为集合中的所有名称都不同。

您可以添加

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

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

根据
set
的定义(其中
TreeSet
继承): :

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

但是
TreeSet
也必须(从:):

如果要正确实现set接口,set维护的顺序(无论是否提供显式比较器)必须与equals一致


因此,您的
compareTo()
方法应该首先通过
name
检查两个
Person
是否等于

:

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

但是
TreeSet
也必须(从:):

如果要正确实现set接口,set维护的顺序(无论是否提供显式比较器)必须与equals一致


因此,您的
compareTo()
方法应该检查两个
Person
是否
相等()
首先按
名称
,如果没有,请检查他们的
年龄

是否有任何方法可以使用按年龄设置的排序元素,但可以按名称比较相同的元素?对
树集使用自定义比较器
?比较器应首先按年龄进行比较,然后按名称进行比较-就是这样!是否有任何方法可以使用按年龄设置的排序元素,但不使用comp按名称是否为同一元素?对
树集使用自定义比较器
?比较器应首先按年龄进行比较,然后按名称进行比较-就是这样!您的意思是set不能按年龄排序和按名称进行比较?您的意思是set不能按年龄排序和按名称进行比较?