kotlin中的分组类

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)、学生(“

我有一个名为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)、学生(“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())
}