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

Kotlin中类分组:将Student列表转换为GroupedStudent列表的方法

解决Kotlin学生数据分组问题

嘿,这个需求用Kotlin标准库的集合操作就能轻松实现,我给你一步步拆解说明:

1. 先定义对应的数据类

首先得把需求里提到的GroupedStudent和SubjectMarks类明确下来,和原有的Student类做好对应:

// 原有的学生数据类
data class Student(val name: String, val subject: String, val marks: Int)

// 单科目成绩的封装类
data class SubjectMarks(val subject: String, val marks: Int)

// 分组后的学生数据类
data class GroupedStudent(
    val studentName: String,
    val subjectMarksList: List<SubjectMarks>
)

2. 执行分组转换逻辑

我们可以借助Kotlin集合的groupBy函数先按姓名分组,再把每个分组的Student列表转换成SubjectMarks列表,最后封装成GroupedStudent对象:

fun main() {
    val students: List<Student> = mutableListOf(
        Student("A", "X", 1),
        Student("A", "Y", 2),
        Student("B", "X", 2),
        Student("B", "Y", 2)
    )

    val groupedStudents: List<GroupedStudent> = students
        // 第一步:按学生姓名分组,得到键为姓名、值为对应Student列表的Map
        .groupBy { it.name }
        // 第二步:遍历Map,把每个键值对转换成GroupedStudent实例
        .map { (studentName, studentList) ->
            GroupedStudent(
                studentName = studentName,
                subjectMarksList = studentList.map { SubjectMarks(it.subject, it.marks) }
            )
        }

    // 打印验证结果
    groupedStudents.forEach { println(it) }
}

3. 结果说明

运行上面的代码后,会输出符合预期的分组结果:

GroupedStudent(studentName=A, subjectMarksList=[SubjectMarks(subject=X, marks=1), SubjectMarks(subject=Y, marks=2)])
GroupedStudent(studentName=B, subjectMarksList=[SubjectMarks(subject=X, marks=2), SubjectMarks(subject=Y, marks=2)])

简单梳理下核心逻辑:

  • groupBy { it.name }会自动把所有同名的Student实例归到同一组,返回一个Map<String, List<Student>>结构。
  • 后续的map操作则是把分组后的键值对,转换成我们需要的GroupedStudent格式,其中每个Student会被映射成SubjectMarks对象,最终组成对应学生的科目成绩列表。

内容的提问来源于stack exchange,提问作者Rax

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:51:06