基于多条件去除列表重复元素:Student对象去重的Comparator实现求助
清理重复Student对象的解决方案
没问题!我来帮你完善Comparator实现,顺便给你两种适配不同场景的去重方案,你可以按需选择:
方案一:用Comparator配合TreeSet去重(支持排序)
首先我们先补全Student类的基础结构(确保能访问到name和ID字段),然后实现自定义Comparator:
1. 补全Student类
class Student { private String name; private String id; private String extraField; // 对应你构造函数里的第三个参数 public Student(String name, String id, String extraField) { this.name = name; this.id = id; this.extraField = extraField; } // 必须提供getter,因为Comparator需要读取字段值 public String getName() { return name; } public String getId() { return id; } public String getExtraField() { return extraField; } // 重写toString方便查看结果 @Override public String toString() { return "Student{name='" + name + "', id='" + id + "', extraField='" + extraField + "'}"; } }
2. 实现自定义Comparator
这个Comparator会先比较name,name相同时再比较ID,当两者都相同时返回0(TreeSet会把返回0的元素判定为重复):
import java.util.Comparator; public class StudentDuplicateComparator implements Comparator<Student> { @Override public int compare(Student s1, Student s2) { // 先按name排序,name不同直接返回比较结果 int nameCompare = s1.getName().compareTo(s2.getName()); if (nameCompare != 0) { return nameCompare; } // name相同则比较ID,ID相同返回0(视为重复) return s1.getId().compareTo(s2.getId()); } }
3. 在你的主类中使用去重
import java.util.ArrayList; import java.util.TreeSet; import java.util.List; public class RemoveDuplicate { public static void main(String[] args) { List<Student> 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("Student1", "1000", "4")); // 这是重复项,name和ID都匹配第一个 // 用TreeSet+自定义Comparator自动去重 TreeSet<Student> uniqueStudentSet = new TreeSet<>(new StudentDuplicateComparator()); uniqueStudentSet.addAll(students); // 如果需要转回List格式 List<Student> uniqueStudents = new ArrayList<>(uniqueStudentSet); // 打印验证结果 uniqueStudents.forEach(System.out::println); } }
方案二:重写equals+hashCode(单纯去重更高效)
如果你不需要对列表排序,只是想快速去重,更推荐遵循Java规范,重写Student类的equals()和hashCode()方法,这样可以用HashSet或者Stream的distinct()来去重,效率更高:
重写Student类的equals和hashCode
import java.util.Objects; class Student { // 字段、构造函数、getter和toString不变 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; // 仅当name和ID都相同时,判定为相等 return name.equals(student.name) && id.equals(student.id); } @Override public int hashCode() { // 用name和ID生成哈希值 return Objects.hash(name, id); } }
两种去重方式
// 方式1:用Stream的distinct() import java.util.stream.Collectors; List<Student> uniqueStudents = students.stream() .distinct() .collect(Collectors.toList()); // 方式2:用HashSet import java.util.HashSet; Set<Student> uniqueSet = new HashSet<>(students); List<Student> uniqueStudents = new ArrayList<>(uniqueSet);
小提示
- 如果需要去重+排序,选方案一;
- 如果只是单纯去重,方案二更高效,也更符合Java对象相等性的规范。
内容的提问来源于stack exchange,提问作者Durgaprasad
相关产品推荐
相关产品推荐

