Come convertire la lista in mappa in Kotlin?


170

Ad esempio ho un elenco di stringhe come:

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

e voglio convertirlo in una mappa, dove le stringhe sono le chiavi.

So che dovrei usare la .toMap()funzione, ma non so come, e non ne ho visto alcun esempio.

Risposte:


319

Hai due scelte:

Il primo e il più performante è usare la associateByfunzione che accetta due lambda per generare la chiave e il valore e sottolinea la creazione della mappa:

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

Il secondo, meno performante, è usare la mapfunzione standard per creare un elenco Pairche può essere usato toMapper generare la mappa finale:

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

1
grazie. è più veloce perché crea una mappa e non converte un elenco di coppie in una mappa, come nel mio esempio?
LordScone,

4
@lordScone Esattamente, le allocazioni delle Pairistanze potrebbero essere molto costose per le grandi collezioni
voddan

41

Da Lista Mapcon associatefunzione

Con Kotlin 1.3, Listha una funzione chiamata associate. associateha la seguente dichiarazione:

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

Restituisce una Mapcoppia chiave-valore contenente fornita dalla transformfunzione applicata agli elementi della raccolta specificata.

Uso:

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

fun main() {
    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}
}    

Da Lista Mapcon associateByfunzione

Con Kotlin, Listha una funzione chiamata associateBy. associateByha la seguente dichiarazione:

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

Restituisce a Mapcontenente i valori forniti valueTransforme indicizzati dalle keySelectorfunzioni applicate agli elementi della raccolta specificata.

Uso:

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

fun main() {
    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}
}

3
Qual è la differenza tra associate e associateBy? Vorrei preferire l'uso l'uno sull'altro, visto che producono lo stesso risultato?
Waynesford,

11
  • Converti elementi di sequenza Iteratable in una mappa in kotlin,
  • associate vs associateBy vs associateCon:

* Riferimento: documentazione di Kotlin

1- associa (per impostare chiavi e valori): crea una mappa in grado di impostare elementi chiave e valore:

IterableSequenceElements.associate { newKey to newValue } //Output => Map {newKey : newValue ,...}

Se una delle due coppie avesse la stessa chiave, l'ultima verrà aggiunta alla mappa.

La mappa restituita conserva l'ordine di iterazione della voce dell'array originale.

2- associateBy (basta impostare le chiavi tramite il calcolo): costruire una mappa in cui possiamo impostare nuove chiavi, elementi analoghi verranno impostati per i valori

IterableSequenceElements.associateBy { newKey } //Result: => Map {newKey : 'Values will be set  from analogous IterableSequenceElements' ,...}

3- associateWith (basta impostare i valori tramite calcolo): costruire una mappa in cui possiamo impostare nuovi valori, elementi analoghi verranno impostati per le chiavi

IterableSequenceElements.associateWith { newValue }  //Result => Map { 'Keys will be set from analogous IterableSequenceElements' : newValue , ...}

Esempio dai suggerimenti di Kotlin: inserisci qui la descrizione dell'immagine


10

È possibile utilizzare associateper questa attività:

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

In questo esempio, le stringhe di listdiventano le chiavi e le loro lunghezze corrispondenti (come esempio) diventano i valori all'interno della mappa.


7

Se nel tuo elenco sono presenti duplicati che non vuoi perdere, puoi farlo utilizzandogroupBy .

Altrimenti, come hanno detto tutti gli altri, usare associate/By/With(che nel caso dei duplicati, credo, restituirà solo l'ultimo valore con quella chiave).

Un esempio che raggruppa un elenco di persone per età:

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

fun main() {
    val people = listOf(Person("Sue Helen", 31), Person("JR", 25), Person("Pamela", 31))

    val duplicatesKept = people.groupBy { it.age }
    val duplicatesLost = people.associateBy({ it.age }, { it })

    println(duplicatesKept)
    println(duplicatesLost)
}

risultati:

{31=[Person@41629346, Person@4eec7777], 25=[Person@3b07d329]}
{31=Person@4eec7777, 25=Person@3b07d329}

0

Che sono cambiati nella versione RC.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.