我自定义了一个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方法中,我们遍历第二个名单,检查每个学生是否在第一个名单的对应列表中。如果在第一个名单中找到了相同的学生,我们就检查这个列表是否为空,如果不为空,说明有变化。最后,我们检查第一个名单中的每个列表,打印出所有剩余的学生,这些学生被认为是被删除的。