因两个名单中的id不同,所以不能拿id当参照物。只需要比较name,class这两个字段

我自定义了一个Student类,其中Student类有id,age,name,class这些字段,然后现在有两个学生名单,然后我想对比一下这两个名单的学生,
第二个名单里的学生和第一个名单的学生相比,哪些学生是没变化的,哪些是变化的,然后只需要比较name,class这两个字段,其中因两个名单中的id不同,所以不能拿id当参照物写一段java代码

import java.util.Objects;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class Student {
    private int id;
    private int age;
    private String name;
    private String classRoom;

    // 构造函数
    public Student(int id, int age, String name, String classRoom) {
        this.id = id;
        this.age = age;
        this.name = name;
        this.classRoom = classRoom;
    }

    public Student(String name, String classRoom) {
        this.name = name;
        this.classRoom = classRoom;
    }

    // Getters and Setters
    public int getId() {
        return id;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    public String getClassRoom() {
        return classRoom;
    }

    // equals 方法只比较 name 和 classRoom 字段
    @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(name, student.name) &&
                Objects.equals(classRoom, student.classRoom);
    }

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

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

正式比较的方法

import com.atguigu.demomptest.entity.Student;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class StudentComparator {
    public static void compareStudents(List<Student> list1, List<Student> list2) {
        // 使用两个map存储学生名单,以name和classRoom为key
        Map<String, List<Student>> map1 = new HashMap<>();
        for (Student s : list1) {
            map1.computeIfAbsent(s.getName() + " " + s.getClassRoom(),
                    k -> new ArrayList<>()).add(s);
        }

        // 遍历第二个名单,比较 name 和 classRoom 字段
        for (Student s2 : list2) {
            List<Student> students = map1.get(s2.getName() + " " + s2.getClassRoom());
            if (students != null && !students.isEmpty()) {
                // 找到了具有相同name和classRoom的学生
                students.removeIf(student -> student.equals(s2)); // 移除相同的学生
                if (students.isEmpty()) {
                    System.out.println("Unchanged: " + s2.getId());
                } else {
                    System.out.println("Changed: " + s2.getId());
                }
            } else {
                // 没有找到具有相同name和classRoom的学生
                System.out.println("Changed: " + s2.getId());
            }
        }
 // 检查第一个名单中是否有被删除的学生
        for (List<Student> students : map1.values()) {
            for (Student s1 : students) {
                System.out.println("Removed: " + s1);
            }
        }

    }

    public static void main(String[] args) {
        List<Student> list1 = new ArrayList<>();
        List<Student> list2 = new ArrayList<>();

        // 示例数据,填充两个名单
        list1.add(new Student(1, 10, "Alice", "Math"));
        list1.add(new Student(2, 12, "Bob", "Science"));

        list2.add(new Student(3, 10, "Alice", "Math")); // 未变化
        list2.add(new Student(4, 12, "Bob", "Math"));   // 变化
        list2.add(new Student(5, 11, "Charlie", "PE")); // 新增

        compareStudents(list1, list2);
    }}

在这个代码中,我们使用了一个Map<String, List>来存储每个name和classRoom组合的学生列表。
这样,即使id不同,只要name和classRoom相同,我们就认为这些学生是相同的。在compareStudents方法中,我们遍历第二个名单,检查每个学生是否在第一个名单的对应列表中。如果在第一个名单中找到了相同的学生,我们就检查这个列表是否为空,如果不为空,说明有变化。最后,我们检查第一个名单中的每个列表,打印出所有剩余的学生,这些学生被认为是被删除的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值