Home > Mobile >  Create map from list of list
Create map from list of list

Time:12-14

I want to create map from list of list and I have write this code

fun getCourses(coursesCount: Int): Map<Course, Int> {
    val paidCourses = mutableMapOf<Course, Int>()
    for(student in data) {
                for(course in student.subscribedCourses) {
                    if( course.isPaid ) {
                        paidCourses.putIfAbsent(course, 0)
                        paidCourses[course] = paidCourses[course]!!   1
                    }
                }
            }
    return paidCourses.toList().sortedByDescending { (_, value) -> value }.take(coursesCount).toMap()
}

I wonder how can I concise this more in Kotlin.

CodePudding user response:

You can do a flatMap to flatten the "students with courses" to just a single list of all the courses, filter by isPaid, group by each course, and use eachCount to count the courses.

val paidCourses = 
    data.flatMap { it.subscribedCourses }
        .filter { it.isPaid }
        .groupingBy { it }.eachCount()

Note that this will create multiple intermediate lists and loop through them multiple times, which may be undesirable. Here's a way that avoids this, and is still quite concise:

val paidCourses = mutableMapOf<Course, Int>()
for(student in data) {
    for(course in student.subscribedCourses) {
        if (course.isPaid) {
            paidCourses.merge(course, 1, Int::plus)
        }
    }
}

You can also do:

val paidCourses = mutableMapOf<Course, Int>()
for(student in data) {
    student.subscribedCourses.filter { it.isPaid }
        .groupingBy { it }
        .eachCountTo(paidCourses)
}

CodePudding user response:

You can use merge to increment the frequency.

paidCourses.merge(course, 1, Int::plus)
  • Related