Pregunta Cómo convertir una lista a un mapa en Kotlin?


Por ejemplo, tengo una lista de cadenas como:

val list = listOf("a", "b", "c", "d")

y quiero convertirlo a un mapa, donde las cadenas son las claves.

Sé que debería usar la función .toMap (), pero no sé cómo y no he visto ejemplos de esto.


73
2017-10-04 16:03


origen


Respuestas:


Tienes dos opciones:

El primero y más eficiente es usar associateBy función que toma dos lambdas para generar la clave y el valor, y enuncia la creación del mapa:

val map = friends.associateBy({it.facebookId}, {it.points})

El segundo, menos eficiente, es usar el estándar map función para crear una lista de Pair que puede ser utilizado por toMap para generar el mapa final:

val map = friends.map { it.facebookId to it.points }.toMap()

172
2017-10-04 21:43



# 1. De List a Map con associate función

Con Kotlin, List tiene una función llamada associate. associate tiene la siguiente declaración:

fun <T, K, V> Iterable<T>.associate(transform: (T) -> Pair<K, V>): Map<K, V>

Devuelve un Map que contiene pares clave-valor proporcionados por transform función aplicada a elementos de la colección dada.

Uso:

class Person(val name: String, val id: Int)

fun main(args: Array<String>) {
    val friends = listOf(Person("Sue Helen", 1), Person("JR", 2), Person("Pamela", 3))
    val map = friends.associate({ Pair(it.id, it.name) })
    //val map = friends.associate({ it.id to it.name }) // also works

    println(map) // prints: {1=Sue Helen, 2=JR, 3=Pamela}
}    

# 2. De List a Map con associateBy función

Con Kotlin, List tiene una función llamada associateBy. associateBy tiene la siguiente declaración:

fun <T, K, V> Iterable<T>.associateBy(keySelector: (T) -> K, valueTransform: (T) -> V): Map<K, V>

Devuelve un Map que contiene los valores proporcionados por valueTransform e indexado por keySelector funciones aplicadas a elementos de la colección dada.

Uso:

class Person(val name: String, val id: Int)

fun main(args: Array<String>) {
    val friends = listOf(Person("Sue Helen", 1), Person("JR", 2), Person("Pamela", 3))
    val map = friends.associateBy(keySelector = { person -> person.id }, valueTransform = { person -> person.name })
    //val map = friends.associateBy({ it.id }, { it.name }) // also works

    println(map) // prints: {1=Sue Helen, 2=JR, 3=Pamela}
}

17
2017-07-06 13:42



Puedes usar associate para esta tarea:

val list = listOf("a", "b", "c", "d")
val m: Map<String, Int> = list.associate { it to it.length }

En este ejemplo, las cuerdas de list se convierten en las claves y sus longitudes correspondientes (como un ejemplo) se convierten en los valores dentro del mapa.


2
2018-04-27 06:36



Eso ha cambiado en la versión RC.

estoy usando val map = list.groupByTo(destinationMap, {it.facebookId}, { it -> it.point })


0
2018-02-10 11:59



Por ejemplo, tiene una lista de cadenas como:

val list = listOf("a", "b", "c", "d")

y necesitas convertirlo a un mapa, donde las cadenas son las claves.

Hay dos maneras de hacer esto:

El primero y más eficiente es usar la función associateBy que toma dos lambdas para generar la clave y el valor, y enmarca la creación del mapa:

val map = friends.associateBy({it.facebookId}, {it.points})

El segundo, menos eficiente, es usar la función de mapa estándar para crear una lista de pares que pueda usar toMap para generar el mapa final:

val map = friends.map { it.facebookId to it.points }.toMap()

Fuente: https://hype.codes/how-convert-list-map-kotlin


-1
2017-07-04 04:52