Как перевернуть карту в Котлине с помощью неизменного преобразования - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть следующая карта Котлина, и я хочу перевернуть карту, для дублированного нового ключа значение будет добавлено в список.

val map = Map(1 to 111, 2 to 222, 3 to 111)

После преобразования карта результата будет

Map(111 to List(1,3), 222 to 2)

PS: я разработал способ сделать это путем создания изменяемой карты и итерации существующей карты. Но я больше ищу непреложный способ сделать это.

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Вот отличный способ сделать это без использования изменяемых коллекций, с 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)
        }
0 голосов
/ 08 сентября 2018

Вы можете сгруппировать записи карты по их ключу выбора значения из каждой записи:

    val map = mapOf(1 to 111, 2 to 222, 3 to 111)

    val reversed = map.entries.groupBy({ it.value }, { it.key })

    println(reversed) // prints: {111=[1, 3], 222=[2]}
0 голосов
/ 08 сентября 2018

Вы должны быть в состоянии сделать что-то вроде этого:

fun reverse(map: Map<Int, Int>): Map<Int, List<Int>> {
  val mm = mutableMapOf<Int, List<Int>>()
  map.forEach { k, v -> mm[v] = mm.getOrDefault(v, listOf()) + k }

  return mm
}

Это оставит вас со списком для всех значений карты, но обратное отображение карты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...