如何基于多属性值将对象数组拆分为子列表?
解决方案
因为你的列表已经按学区、学校、年级、科目排序完成,同组元素必然连续,所以完全可以不用Map等数据结构,仅通过遍历+跟踪当前分组的方式实现拆分:
核心逻辑
- 初始化一个用于存放分组结果的嵌套列表
- 若原列表为空,直接返回空结果
- 从第一个元素开始,初始化第一个分组
- 遍历后续每个元素:
- 对比当前元素与当前分组的第一个元素的学区ID/Name、学校ID/Name、年级ID/Name、科目ID/Name
- 若所有属性完全匹配,将元素加入当前分组
- 若不匹配,将当前分组存入结果列表,再新建分组并加入当前元素
- 遍历结束后,记得把最后一个分组存入结果列表
代码示例
Python 实现
假设每个学生对象是包含对应属性的字典:
def group_students(sorted_students): if not sorted_students: return [] grouped = [] current_group = [sorted_students[0]] # 抽取属性对比逻辑,让代码更整洁 def is_same_group(student_a, student_b): return (student_a['district_id'] == student_b['district_id'] and student_a['district_name'] == student_b['district_name'] and student_a['school_id'] == student_b['school_id'] and student_a['school_name'] == student_b['school_name'] and student_a['grade_id'] == student_b['grade_id'] and student_a['grade_name'] == student_b['grade_name'] and student_a['subject_id'] == student_b['subject_id'] and student_a['subject_name'] == student_b['subject_name']) for student in sorted_students[1:]: if is_same_group(student, current_group[0]): current_group.append(student) else: grouped.append(current_group) current_group = [student] # 加入最后一组 grouped.append(current_group) return grouped
Java 实现
假设存在Student实体类,包含对应属性及Getter方法:
import java.util.ArrayList; import java.util.List; import java.util.Objects; public class StudentGrouping { public static List<List<Student>> groupStudents(List<Student> sortedStudents) { List<List<Student>> groupedResult = new ArrayList<>(); if (sortedStudents.isEmpty()) { return groupedResult; } List<Student> currentGroup = new ArrayList<>(); currentGroup.add(sortedStudents.get(0)); for (int i = 1; i < sortedStudents.size(); i++) { Student currentStudent = sortedStudents.get(i); Student firstInGroup = currentGroup.get(0); if (isSameGroup(currentStudent, firstInGroup)) { currentGroup.add(currentStudent); } else { groupedResult.add(currentGroup); currentGroup = new ArrayList<>(); currentGroup.add(currentStudent); } } // 添加最后一个分组 groupedResult.add(currentGroup); return groupedResult; } // 抽取属性对比方法,处理空值情况 private static boolean isSameGroup(Student a, Student b) { return Objects.equals(a.getDistrictId(), b.getDistrictId()) && Objects.equals(a.getDistrictName(), b.getDistrictName()) && Objects.equals(a.getSchoolId(), b.getSchoolId()) && Objects.equals(a.getSchoolName(), b.getSchoolName()) && Objects.equals(a.getGradeId(), b.getGradeId()) && Objects.equals(a.getGradeName(), b.getGradeName()) && Objects.equals(a.getSubjectId(), b.getSubjectId()) && Objects.equals(a.getSubjectName(), b.getSubjectName()); } // 示例Student实体类 static class Student { private String districtId; private String districtName; private String schoolId; private String schoolName; private String gradeId; private String gradeName; private String subjectId; private String subjectName; private String studentId; private String studentName; // Getter方法 public String getDistrictId() { return districtId; } public String getDistrictName() { return districtName; } public String getSchoolId() { return schoolId; } public String getSchoolName() { return schoolName; } public String getGradeId() { return gradeId; } public String getGradeName() { return gradeName; } public String getSubjectId() { return subjectId; } public String getSubjectName() { return subjectName; } // 构造器、Setter等省略 } }
注意事项
- 因为依赖列表的排序顺序,务必确保原列表严格按学区→学校→年级→科目的顺序排序,否则会出现分组错误
- 若属性存在空值,需在对比逻辑中做空值兼容(如Java示例中用
Objects.equals)
内容的提问来源于stack exchange,提问作者Software Developer
相关产品推荐
相关产品推荐

