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.