gpt4 book ai didi

java - 当整个学生对象是唯一的时,为什么 TreeSet 不能让学生年龄相似?

转载 作者:行者123 更新时间:2023-12-02 04:31:20 27 4
gpt4 key购买 nike

我有一个数据类型StudentSet。它接受姓名和年龄。当我将其添加到 TreeSet 时,不会添加年龄相似的学生。我知道 TreeSet 只添加唯一项,但我对学生有不同的名称,所以作为一个整体,StudentSet 不是唯一的吗?我想知道这背后的原因。

以下是我的代码

import java.util.Comparator;
import java.util.TreeSet;

public class StudentSet implements Comparable<StudentSet> {
String name;
int age;

public StudentSet(String name, int age) {
super();
this.name = name;
this.age = age;
}

@Override
public String toString() {
return "Student[Name= " + name + "," + " Age= " + age + "]";
}


public static void main(String[] args) {
TreeSet<StudentSet> set = new TreeSet<>();
set.add(new StudentSet("xyz", 21));
set.add(new StudentSet("abc", 23));
set.add(new StudentSet("xyxyxr", 24));
System.out.println(set.add(new StudentSet("aaaaaa", 20))); //prints false
System.out.println(set.add(new StudentSet("bbbbbb", 20))); //prints false
System.out.println(set.add(new StudentSet("cccc", 20))); //prints false

TreeSet<StudentSet> sort = new TreeSet<>(new Comparator<StudentSet>() {
@Override
public int compare(StudentSet o1, StudentSet o2) {
return o1.name.compareTo(o2.name);
}
});

sort.addAll(set);
System.out.println("Sorting According to Name\n");
for (StudentSet s : sort) {
System.out.println(s);
}
System.out.println();

sort = new TreeSet<>(new Comparator<StudentSet>() {
@Override
public int compare(StudentSet o1, StudentSet o2) {
return o1.compareTo(o2);
}
});

System.out.println("Sorting According to Age\n");
sort.addAll(set);
for (StudentSet s : sort) {
System.out.println(s);
}
System.out.println();

sort = new TreeSet<>(new Comparator<StudentSet>() {
@Override
public int compare(StudentSet o1, StudentSet o2) {
int lastIndex1 = o1.name.lastIndexOf(" ");
int lastIndex2 = o2.name.lastIndexOf(" ");

String lastName1 = o1.name.substring(lastIndex1);
String lastName2 = o2.name.substring(lastIndex2);
if (lastName1.equals(lastName2)) {
return o1.name.compareTo(o2.name);
} else {
return lastName1.compareTo(lastName2);
}
}
});

System.out.println("Sorting According to Last Name\n");
sort.addAll(set);
for (StudentSet s : sort) {
System.out.println(s);
}
}

@Override
public int compareTo(StudentSet o) {
return ((Integer) this.age).compareTo(o.age);
}
}

更新:

罪魁祸首是我在 StudentSet 中设置了 compareTo() 方法来比较年龄,TreeSet 内部使用该方法来比较年龄比较并检查唯一性。

这是我更正且满意的代码。

@Override
public int compareTo(StudentSet o)
{
int i = Integer.compare(this.age, o.age);
if (i == 0)
return this.name.compareTo(o.name);
else
return i;
}

最佳答案

您正在创建 4 个 TreeSet 实例,每个实例都有一个不同的 Comparator。传递给 TreeSetComparator 确定两个元素是否相同。

在第一个 TreeSet 中,您没有将任何 Comparator 传递给构造函数,这意味着自然顺序(由 Comparable 定义)是用过的。 ComparablecompareTo 仅按年龄进行比较。

在第三个 TreeSet 中,您正在使用此 compare 方法:

    @Override
public int compare(StudentSet o1, StudentSet o2)
{
return o1.compareTo(o2);
}

由于 compareTo 仅按年龄进行比较,因此具有相同年龄的两个 StudentSet 实例被视为相同,并且只会将其中一个添加到 TreeSet 中.

如果您希望将原始 set TreeSet 以及 3 个 TreeSet 分配给 sort 变量要包含所有唯一元素,所有 comparecompareTo 方法都必须按确定唯一 StudentSet 实例的所有属性进行排序。

他们可以通过每次以不同的顺序比较属性来使用不同的顺序对 TreeSet 进行排序。例如,一个可以先比较姓名,然后比较年龄(如果姓名相等),另一个可以先比较年龄,然后比较姓名(如果年龄相等)。

关于java - 当整个学生对象是唯一的时,为什么 TreeSet 不能让学生年龄相似?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31426022/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com