【发布时间】:2026-02-22 08:30:01
【问题描述】:
我有一个列表,其中包含要清理的重复 Student 对象。如果列表中的对象具有相同的名称和 ID,则应删除它们。
有人可以帮助下面的 Comparator 实现吗?
public class RemoveDuplicate {
public static void main(String[] args) {
final ArrayList students = new ArrayList();
students.add(new Student("Student1", "1000", "1"));
students.add(new Student("Student2", "1001", "2"));
students.add(new Student("Student3", "1002", "3"));
students.add(new Student("Student4", "1001", "4"));
students.add(new Student("Student1", "1003", "45"));
students.add(new Student("Student1", "1000", "46"));
students.add(new Student("Student4", "1001", "47"));
Set set = new TreeSet(new StudentsComparator());
set.addAll(students);
final ArrayList newList = new ArrayList(set);
System.out.println(newList);
}
}
class StudentsComparator implements Comparator<Student> {
@Override
public int compare(Student s1, Student s2) {
System.out.println(s1 + "," + s2);
if (s1.getId().equalsIgnoreCase(s2.getId())) {
if (s1.getNum().equalsIgnoreCase(s2.getNum())) {
System.out.println("return0");
return 0;
}
}
return 1;
}
}
实际输出:
Name=Student1 Id=1000 Num=1,
Name=Student2 Id=1001 Num=2,
Name=Student3 Id=1002 Num=3,
Name=Student4 Id=1001 Num=4,
Name=Student1 Id=1003 Num=45,
Name=Student1 Id=1000 Num=46,
Name=Student4 Id=1001 Num=47]
预期输出:
Name=Student1 Id=1000 Num=1,
Name=Student2 Id=1001 Num=2,
Name=Student3 Id=1002 Num=3,
Name=Student4 Id=1001 Num=4,
Name=Student1 Id=1003 Num=45]
谢谢
【问题讨论】:
-
getId和getNum从Student返回哪些值?为什么没有compare返回负数表示s1 -
那不是一个有效的比较器。它可以返回 1,但永远不能返回负数,因此它不是反对称的。
-
为了可读性重写了描述。
标签: java list collections