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()
