Учитывая List
(поскольку порядок имеет значение) Pair<Int, String>
, например:
val list = listOf(1 to "a", 2 to "a", 3 to "b", 4 to "b", 5 to "b", 6 to "a", 7 to "a", 8 to "a")
, вы можете сделать что-то вроде этого:
fun groupCount(list: List<Pair<Int, String>>): Map<String, List<Int>> {
val countMap = mutableMapOf<String, Int>()
var currentStr = list.firstOrNull()?.second ?: return emptyMap()
return list.map { (key, value) ->
if(currentStr != value) {
currentStr = value
countMap[value] = ((countMap[value] ?: 0) + 1)
}
key to value + countMap.getOrPut(value, {1})
}.groupBy ({it.second}, {it.first})
}
В конце концов, у Котлина groupBy становится особенно удобным, когда вам нужно повернуть это
[(1, a1), (2, a1), (3, b1), (4, b1), (5, b1), (6, a2), (7, a2), (8, a2)]
в это:
{a1 = [1,2], b1 = [3, 4, 5], a2 = [6, 7, 8]}
Если у вас есть Map<Int, String>
, вы можете позвонить toList()
прежде чем передать его на groupCount
.