Kotlin Есть ли способ сгладить картук списку <T> - PullRequest
0 голосов
/ 20 ноября 2018

Я хотел бы преобразовать карту в список

например, у меня есть

mapOf("a" to listOf(1,2),
      "b" to listOf(3,4)
)

Я хочу, чтобы результат был

listOf("a", 1, 2, "b", 3, 4)

, порядок должен быть Key иего значения, ключ и его значения, ...

есть ли какая-нибудь функция в kotlin, которая может помочь мне с этим?

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Вы можете flatMap свыше map.entries.Взгляните на эту функцию :

val map = mapOf("a" to listOf(1,2), 
                "b" to listOf(3,4))
println(map)
val flattened : List<Any> = map.entries.flatMap {entry -> 
    //create list with key as only element, must be type <Any> to add other stuff later
    val list = mutableListOf<Any>(entry.key)
    //add values
    list.addAll(entry.value)
    list
}
println(flattened)

отпечатков:

{a=[1, 2], b=[3, 4]}
[a, 1, 2, b, 3, 4]

@ Ответ Роланда вдохновил эту еще более простую, более идиоматическую версию.По сути, он делает то же самое, но объединяет все в одну строку:

 val flattened: List<Any> = map.flatMap {entry -> 
        listOf(entry.key) + entry.value
 }
0 голосов
/ 20 ноября 2018

Мой второй вариант комментария в качестве ответа для Map<String, List<Int>>:

mapOf("a" to listOf(1,2),
      "b" to listOf(3,4))
     .flatMap { (key, values) -> listOf(key) + values }

, который дает List<Any> с ключами и их значениями.

В этом примере используется декларация о разрушении и Map.flatMap.

0 голосов
/ 20 ноября 2018

ОБНОВЛЕНИЕ : ответ ниже был написан до того, как вопрос был обновлен и изменен способ создания карты (подробности см. В истории вопроса).Поскольку вопрос сейчас стоит, ответ ниже не будет работать.Я полагаю, что он работает для вопроса, который был задан изначально.

@ Роланд прав, что ваша карта никогда не приведёт к этому списку, потому что на карте может быть только одно значение против любого данного ключа.Поэтому я думаю, что вам нужно заменить эту карту списком пар.Затем вы можете сгруппировать его и отобразить на карте, чтобы получить желаемый результат:

val pairs = listOf("a" to 1, "a" to 2, "b" to 3, "b" to 4)
val result = pairs
        .groupBy { it.first }
        .flatMap { (key, values) -> listOf(key).plus(values.map { it.second }) }

Еще один немного другой вариант, который вы могли бы счесть более читабельным, это:

val result = pairs
        .groupBy({ it.first }, { it.second })
        .flatMap { (key, values) -> listOf(key).plus(values) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...