https://www.nowcoder.com/discuss/695659297362976768

chatgpt:

在处理大量数据时,寻找重复项是一项常见任务。可以通过以下步骤高效地找到重复的学生信息。这里我们假设学生类包含 id(学号)、name(姓名)和 age(年龄)等字段。


方法:使用哈希表去重

利用哈希表存储已出现的学生信息,找到重复项。

示例代码:

import java.util.*;

class Student {
    String id;
    String name;
    int age;

    public Student(String id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return Objects.equals(id, student.id) &&
               Objects.equals(name, student.name) &&
               age == student.age;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, age);
    }

    @Override
    public String toString() {
        return "Student{id='" + id + "', name='" + name + "', age=" + age + '}';
    }
}

public class FindDuplicates {
    public static void main(String[] args) {
        // 假设有十万条学生信息
        List<Student> students = generateStudents(100000);

        // 用来存储已存在的学生
        Set<Student> seen = new HashSet<>();
        // 用来存储重复的学生
        Set<Student> duplicates = new HashSet<>();

        for (Student student : students) {
            if (!seen.add(student)) {
                duplicates.add(student); // 如果添加失败,说明重复
            }
        }

        // 输出重复的学生
        System.out.println("重复的学生信息有:" + duplicates.size() + " 条");
        for (Student student : duplicates) {
            System.out.println(student);
        }
    }

    // 模拟生成十万个学生信息
    private static List<Student> generateStudents(int count) {
        List<Student> students = new ArrayList<>();
        for (int i = 0; i < count; i++) {
            students.add(new Student("ID" + (i % 50000), "Name" + (i % 1000), 18 + (i % 5)));
        }
        return students;
    }
}


方法解析:

  1. 使用 HashSet 检测重复
  2. 时间复杂度
  3. 内存复杂度

优化方案:

如果数据量非常大,内存不足,可以考虑:

  1. 使用外部存储

  2. 使用流式处理