web-dev-qa-db-fra.com

Comment convertir une liste en carte en Kotlin?

Par exemple, j'ai une liste de chaînes comme:

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

et je veux le convertir en une carte, où les chaînes sont les clés.

Je sais que je devrais utiliser la fonction .toMap(), mais je ne sais pas comment, et je n'en ai pas vu d'exemples.

128
LordScone

Vous avez deux choix:

La première et la plus performante consiste à utiliser la fonction associateBy prenant deux lambda pour générer la clé et la valeur, et insère la création de la carte:

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

Le second, moins performant, consiste à utiliser la fonction standard map pour créer une liste de Pair pouvant être utilisée par toMap pour générer la carte finale:

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

#1. De List à Map avec la fonction associate

Avec Kotlin 1.3, List a une fonction appelée associate . associate a la déclaration suivante:

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

Retourne un Map contenant les paires clé-valeur fournies par la fonction transform appliquée aux éléments de la collection donnée.

Utilisation:

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}
}    

# 2. De List à Map avec la fonction associateBy

Avec Kotlin, List a une fonction appelée associateBy . associateBy a la déclaration suivante:

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

Retourne un Map contenant les valeurs fournies par valueTransform et indexées par les fonctions keySelector appliquées aux éléments de la collection donnée.

Utilisation:

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}
}
31
Imanou Petit

Vous pouvez utiliser associate pour cette tâche:

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

Dans cet exemple, les chaînes de list deviennent les clés et leurs longueurs correspondantes (à titre d'exemple) deviennent les valeurs à l'intérieur de la carte.

6
s1m0nw1
  • Convertir des éléments de séquence itératifs en une carte en kotlin,
  • associé vs associéPar vs associéAvec:

1- associé (Peut définir des Kays et des Valeurs): Construisez une carte qui peut définir des éléments clés et des valeurs:

IteratableSequenceEements.associate { newKey to newValue } => Map {newKey : 
 newValue ,...}

2- associateBy (peut simplement définir des clés par calcul): créez une carte sur laquelle vous pouvez définir de nouvelles clés, des éléments analogues seront définis pour les valeurs

IteratableSequenceEements.associateBy { newKey } => Map {newKey : 'Values will 
be set  from IteratableSequenceEements' ,...}

3- associateWith (peut juste définir des valeurs par calcul): Construisez une carte avec laquelle nous pouvons définir de nouvelles valeurs, des éléments analogues seront définis pour les clés

IteratableSequenceEements.associateWith { newValue } => Map { 'Keys will be set 
from IteratableSequenceEements' : newValue , ...}

Exemple tiré des astuces Kotlin: enter image description here

0
Hamed Jaliliani

Cela a changé sur la version RC.

J'utilise val map = list.groupByTo(destinationMap, {it.facebookId}, { it -> it.point })

0
lagos