现在有两个学生名单,然后我想对比一下这两个名单的学生,名单一的学生id和名单二的学生的oldid是对应的。只比较,name,class,age,score这些字段.而且oldId可能为0或不存在

需求:
我自定义了一个Student类,其中Student类有id,oldid,name,class,age,score这些字段,然后现在有两个学生名单,然后我想对比一下这两个名单的学生,
第二个名单里的学生和第一个名单的学生相比,哪些学生是没变化的,哪些是新增的,哪些是修改的,删除了几个学生。
注意第一个名单的学生id和第二个名单的学生的oldid是对应的。然后写一个java代码去比较这两个名单,只比较,name,class,age,score这些字段.而且oldId可能为0或不存在

import java.util.Objects;

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

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

    public Student() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getOldId() {
        return oldId;
    }

    public void setOldId(int oldId) {
        this.oldId = oldId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getClassRoom() {
        return classRoom;
    }

    public void setClassRoom(String classRoom) {
        this.classRoom = classRoom;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    private int id;
    private int oldId;
    private String name;
    private String classRoom;
    private int age;
    private int score;

    // 构造函数、getter和setter省略,根据需要添加

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

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

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

在这里插入图片描述
具体的比较方法


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<Integer, Student> map1 = new HashMap<>();
        Map<Integer, Student> map2 = new HashMap<>();
        int removedCount = 0;

        // 将第一个名单的学生存入map,以id为key
        for (Student s : list1) {
            map1.put(s.getId(), s);
        }

        // 遍历第二个名单,为每个学生标注状态
        for (Student s2 : list2) {
            if (s2.getOldId() != 0) {
                if (map1.containsKey(s2.getOldId())) {
                    Student s1 = map1.get(s2.getOldId());
                    if (s1.equals(s2)) {
                        System.out.println("Unchanged: " + s2);
                    } else {
                        System.out.println("Modified: " + s2);
                    }
                    map1.remove(s2.getOldId()); // 从map1中移除已匹配的学生
                } else {
                    System.out.println("Added: " + s2);
                }
            } else {
                System.out.println("Added: " + s2);
            }
            map2.put(s2.getId(), s2);
        }

        // 检查删除的学生
        for (Student s1 : map1.values()) {
            removedCount++;
        }

        System.out.println("Deleted students count: " + removedCount);
    }

    public static void main(String[] args) {
        // 示例代码,创建两个学生名单并调用比较方法
        List<Student> list1 = new ArrayList<>();
        List<Student> list2 = new ArrayList<>();

        Student student1 = new Student(1, "小王", "三一", 18, 90);
        Student student2 = new Student(2, "小赵", "三二", 18, 90);
        Student student3 = new Student(3, "小钱", "三三", 18, 90);
        Student student4 = new Student(4, "小孙", "三四", 19, 90);
        Student student5 = new Student(5, "小李", "三五", 18, 90);
        list1.add(student1);
        list1.add(student2);
        list1.add(student3);
        list1.add(student4);
        list1.add(student5);

        Student student6 = new Student(6, 1, "小王", "三一", 18, 90);
        Student student7 = new Student(7, 2, "小赵", "三二变", 18, 90);
        Student student8 = new Student(8, "小李", "三五增", 18, 90);
        Student student9 = new Student(9, "小张", "三五增", 18, 90);
        Student student10 = new Student(10, 5, "小李", "三五", 18, 90);
        list2.add(student6);
        list2.add(student7);
        list2.add(student8);
        list2.add(student9);
        list2.add(student10);
        compareStudents(list1, list2);
    }
}

不使用oldId作为键:我们通过遍历第二个名单,检查每个学生是否在第一个名单中存在,而不是通过oldId。
标记状态:如果第二个名单中的学生在第一个名单中存在,并且除了id和oldId之外的其他字段相同,则标记为“未变化”;如果字段不同,则标记为“修改”。如果第二个名单中的学生在第一个名单中不存在,则标记为“新增”。
统计删除的学生:在遍历完第二个名单后,检查第一个名单中剩余的学生,这些学生即为删除的学生。
这样,代码可以正确处理新增的学生(oldId可能为0或不存在),并且能够正确标记出未变化、修改和新增的学生,同时统计删除的学生数量。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值