You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于多条件去除列表重复元素: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:44:53