Вот отличный способ сделать это без использования изменяемых коллекций, с groupingBy
и, что более важно, aggregate
:
val map: Map<Int, Int> = mapOf(1 to 111, 2 to 222, 3 to 111)
val result: Map<Int, List<Int>> = map.entries
.groupingBy { it.value }
.aggregate { key: Int, accumulator: List<Int>?, element: Map.Entry<Int, Int>, first: Boolean ->
if (first) {
listOf(element.key)
} else {
accumulator!! + element.key
}
}
Вы также можете игнорировать параметр first
и использовать нулевую обработку, чтобы определить, есть ли у вас аккумулятор, и, конечно, в любом случае вам не нужно явно вводить параметры:
val result: Map<Int, List<Int>> = map.entries
.groupingBy { it.value }
.aggregate { key, accumulator, element, first ->
accumulator?.plus(element.key) ?: listOf(element.key)
}