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
相关产品推荐
相关产品推荐

