How do I group and count elements using groupBy and count in Kotlin?
In Kotlin, you can group elements with groupBy, then count how many items are in each group. Basic example val words = listOf("apple", "banana", "apricot", "blueberry", "avocado") val countsByFirstLetter = words .groupBy { it.first() } .mapValues { (_, words) -> words.count() } println(countsByFirstLetter) Output: {a=3, b=2} Here: groupBy { it.first() } groups words by their […]
Artikel oleh Wayan · Sumber: Kode Java ↗
Terjemahan artikel ini belum tersedia. Isi asli ditampilkan.
In Kotlin, you can group elements with groupBy, then count how many items are in each group.
Basic example
val words = listOf("apple", "banana", "apricot", "blueberry", "avocado")
val countsByFirstLetter = words
.groupBy { it.first() }
.mapValues { (_, words) -> words.count() }
println(countsByFirstLetter)
Output:
{a=3, b=2}
Here:
groupBy { it.first() }groups words by their first letter.mapValues { it.value.count() }converts each grouped list into its size/count.
You can also write it as:
val countsByFirstLetter = words
.groupBy { it.first() }
.mapValues { it.value.size }
Counting objects by a property
data class Person(val name: String, val city: String)
val people = listOf(
Person("Alice", "London"),
Person("Bob", "Paris"),
Person("Charlie", "London"),
Person("Diana", "Paris"),
Person("Eve", "Berlin")
)
val peopleByCity = people
.groupBy { it.city }
.mapValues { it.value.count() }
println(peopleByCity)
Output:
{London=2, Paris=2, Berlin=1}
More efficient option: groupingBy + eachCount
If you only need counts, prefer:
val countsByFirstLetter = words
.groupingBy { it.first() }
.eachCount()
This avoids creating intermediate lists for every group.
println(countsByFirstLetter)
// {a=3, b=2}
So the common choices are:
items.groupBy { key }.mapValues { it.value.count() }
or, more efficiently:
items.groupingBy { key }.eachCount()
