Je souhaite transformer la carte en liste

Par exemple j'ai

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

Je veux que le résultat soit

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

L'ordre doit être Clé et ses valeurs, Clé et ses valeurs, ...

Y a-t-il une fonction dans kotlin qui pourrait m'aider?

1
svkaka 20 nov. 2018 à 15:39

3 réponses

Meilleure réponse

Ma deuxième variante de commentaire comme réponse à un Map<String, List<Int>>:

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

Ce qui donne un List<Any> avec les clés suivies de leurs valeurs.

Cet exemple utilise la déclaration de déstructuration et la Map.flatMap.

5
Roland 20 nov. 2018 à 15:53

Vous pouvez flatMap sur {{X1 }}. Jetez un œil à cette fonction:

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)

Impressions:

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

La réponse de @Rolands a inspiré cette version encore plus simple et plus idiomatique. Il fait essentiellement la même chose, mais rassemble tout dans une seule ligne:

 val flattened: List<Any> = map.flatMap {entry -> 
        listOf(entry.key) + entry.value
 }
1
leonardkraemer 20 nov. 2018 à 15:52

MISE À JOUR : la réponse ci-dessous a été rédigée avant la mise à jour de la question et a modifié la façon dont la carte a été créée (voir l'historique de la question pour plus de détails). Dans l'état actuel de la question, la réponse ci-dessous ne fonctionnera plus. Cela fonctionne pour la question posée à l'origine, je crois.

@Roland a raison de dire que votre carte n'aboutira jamais à cette liste car il ne peut y avoir qu'une seule valeur dans la carte par rapport à une clé donnée. Je pense donc que vous devez remplacer cette carte par une liste de paires. Vous pouvez ensuite le regrouper et le mettre à plat pour obtenir le résultat souhaité:

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

Une autre option légèrement différente que vous pourriez décider est plus lisible est la suivante:

val result = pairs
        .groupBy({ it.first }, { it.second })
        .flatMap { (key, values) -> listOf(key).plus(values) }
2
Yoni Gibbs 20 nov. 2018 à 15:45