kotlin中的分组类
我有一个名为Student的类,有三个字段,我需要将该类转换为GroupedStudent。如何做到这一点kotlin中的分组类,kotlin,Kotlin,我有一个名为Student的类,有三个字段,我需要将该类转换为GroupedStudent。如何做到这一点 var students: List<Student> = mutableListOf(Student("A", "X", 1), Student("A", "Y", 2), Student("B", "X", 2), Student("B", "Y", 2)) var学生:List=mutableListOf(学生(“A”、“X”,1)、学生(“A”、“Y”,2)、学生(“
var students: List<Student> = mutableListOf(Student("A", "X", 1), Student("A", "Y", 2), Student("B", "X", 2), Student("B", "Y", 2))
var学生:List=mutableListOf(学生(“A”、“X”,1)、学生(“A”、“Y”,2)、学生(“B”、“X”,2)、学生(“B”、“Y”,2))
我需要将上面的列表转换为GroupedStudent列表,我该怎么做
他们应该按学生姓名分组,并将科目标记列为列表
class Student {
var name: String
var subject: String
var marks: Int
}
class GroupedStudent {
var name: String
var subMarks: MutableList<SubjectMarks>
}
class SubjectMarks {
var subject: String
var marks: Int
}
班级学生{
变量名称:String
变量主题:字符串
变量标记:Int
}
班级分组学生{
变量名称:String
var子标记:可变列表
}
班级科目分数{
变量主题:字符串
变量标记:Int
}
使用Kotlin stdlib:
var学生:List=mutableListOf(学生(“A”、“X”,1)、学生(“A”、“Y”,2)、学生(“B”、“X”,2)、学生(“B”、“Y”,2))
val groupedMap=students.groupBy{it.name}
val groupedStudents=mutableListOf()
groupedMap.forEach{key,value->
val groupedStudent=groupedStudent(key,value.map{SubjectMarks(it.subject,it.marks)}.toMutableList())
groupedStudent.add(groupedStudent)
}
这将产生一个
GroupedStudent
的List
,每个GroupedStudent
都包含一个具有该名称的学生分数列表 如果您的学生类别是正确的,即分数应该是Int,而不是数组或整数列表,并且您确实希望将其转换为“GroupedStudent list”,则可以使用sortedWith和map方法:
class Student(var name: String, var subject: String, var marks: Int) {
override fun toString(): String = "name: $name, subject: $subject, marks: $marks"
}
class GroupedStudent(var name: String, var subMarks: MutableList<SubjectMarks>) {
override fun toString(): String = "name: $name, subject: $subMarks"
}
class SubjectMarks(var subject: String, var marks: Int) {
override fun toString(): String = "subject name: $subject, marks: $marks"
}
fun main(args: Array<String>) {
val students: List<Student> = mutableListOf(Student("B", "Y", 2),
Student("A", "X", 1),
Student("B", "X", 2),
Student("A", "Y", 2))
val groupedStudents: List<GroupedStudent> = students.sortedWith(compareBy({ it.name }))
.map { student -> GroupedStudent(student.name, mutableListOf(SubjectMarks(student.subject, student.marks))) }
println(groupedStudents)
}
但是如果您想在地图中以名称作为键,以主题/标记列表作为对列表,对学生对象进行分组,您可以使用groupBy:
class Student(var name: String, var subject: String, var marks: Int) {
override fun toString(): String = "name: $name, subject: $subject, marks: $marks"
}
class GroupedStudent(var name: String, var subMarks: MutableList<SubjectMarks>) {
override fun toString(): String = "name: $name, subject: $subMarks"
}
class SubjectMarks(var subject: String, var marks: Int) {
override fun toString(): String = "subject name: $subject, marks: $marks"
}
fun main(args: Array<String>) {
val students: List<Student> = mutableListOf(Student("B", "Y", 2),
Student("A", "X", 1),
Student("B", "X", 2),
Student("A", "Y", 2))
val groupedStudentsMap = mutableMapOf<String, List<Pair<String, Int>>>()
students.groupBy { it.name }
.forEach({ (key, value) ->
groupedStudentsMap[key] = value.map { element -> Pair(element.subject, element.marks) } })
println(groupedStudentsMap)
}
您可以按学生的姓名分组,然后执行两个简单的映射:
students.groupBy(Student::name).map { (name, students) ->
GroupedStudent(name, students.map { SubjectMarks(it.subject, it.marks) }.toMutableList())
}
听起来像是
GroupedStudent
包含了一个Student
s的集合。@Markoto他们应该按studentName分组,并将SubjectMarks作为列表。这不做任何分组。Asker评论:“他们应该按studentName分组,并将SubjectMarks作为列表。”@urgentx my bad,还没有阅读评论。谢谢你指出。我已经更新了答案。你的代码现在无法编译。您的学生变量被推断为映射。条目
,而不是学生
。
class Student(var name: String, var subject: String, var marks: Int) {
override fun toString(): String = "name: $name, subject: $subject, marks: $marks"
}
class GroupedStudent(var name: String, var subMarks: MutableList<SubjectMarks>) {
override fun toString(): String = "name: $name, subject: $subMarks"
}
class SubjectMarks(var subject: String, var marks: Int) {
override fun toString(): String = "subject name: $subject, marks: $marks"
}
fun main(args: Array<String>) {
val students: List<Student> = mutableListOf(Student("B", "Y", 2),
Student("A", "X", 1),
Student("B", "X", 2),
Student("A", "Y", 2))
val groupedStudentsMap = mutableMapOf<String, List<Pair<String, Int>>>()
students.groupBy { it.name }
.forEach({ (key, value) ->
groupedStudentsMap[key] = value.map { element -> Pair(element.subject, element.marks) } })
println(groupedStudentsMap)
}
{B=[(Y, 2), (X, 2)], A=[(X, 1), (Y, 2)]}
students.groupBy(Student::name).map { (name, students) ->
GroupedStudent(name, students.map { SubjectMarks(it.subject, it.marks) }.toMutableList())
}