You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于多属性值将对象数组拆分为子列表?

解决方案

因为你的列表已经按学区、学校、年级、科目排序完成,同组元素必然连续,所以完全可以不用Map等数据结构,仅通过遍历+跟踪当前分组的方式实现拆分:

核心逻辑

  1. 初始化一个用于存放分组结果的嵌套列表
  2. 若原列表为空,直接返回空结果
  3. 从第一个元素开始,初始化第一个分组
  4. 遍历后续每个元素:
    • 对比当前元素与当前分组的第一个元素的学区ID/Name、学校ID/Name、年级ID/Name、科目ID/Name
    • 若所有属性完全匹配,将元素加入当前分组
    • 若不匹配,将当前分组存入结果列表,再新建分组并加入当前元素
  5. 遍历结束后,记得把最后一个分组存入结果列表

代码示例

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:23:23