10
votes

Convertir la liste Scala en carte avec des index sous forme de clés

Tout ce que je voulais faire, c'est convertir les éléments suivants:

Liste (2, 4, 6, 8, 10) à Carte (0 -> 2, 1 -> 4, 2 -> 6, 3 -> 8, 4 - > 10) . En d'autres termes, indice de carte à la valeur. Il devrait être très facile, mais je manque quelque chose.

Quelqu'un peut-il suggérer un moyen simple de le faire?

UPD: juste pour généraliser la solution. Disons que je dois effectuer une transmission supplémentaire de valeurs. Par exemple, pour l'envelopper avec la liste (_) . Dans notre cas:

Liste (2, 4, 6, 8, 10) -> Carte (0 -> Liste (2), 1 -> Liste (4), 2 -> Liste ( 6), 3 -> Liste (8), 4 -> Liste (10))


2 commentaires

Pourquoi ne pas simplement le convertir en un indexedseq (c'est-à-dire myList.Oindexedseq )? Ce sera plus rapide et (probablement) plus compact.


J'ai besoin d'une carte, car je prévois d'effectuer une opération supplémentaire dans une fonctionnalité avec des valeurs / des clés. Mais oui, si vous avez besoin d'un accès aléatoire rapide, indexedseq serait la meilleure solution.


3 Réponses :


19
votes
List(2, 4, 6, 8, 10).zipWithIndex.map(_.swap).toMap

4 commentaires

BTW Le fait que .zipwithindex.tomap n'a pas produit de carte à partir des index aux valeurs est un peu triste.


C'est ce qu'on appelle «zipwithdindex» et non «zipindexwithvalues», donc l'ordre fait certains sens.


Je préfère cela à la solution @ om-Nom-Nom, car elle ne nécessite pas de répéter le symbole XS . Ceci est important pour moi parce que j'essaie d'ajouter ceci à la fin d'une longue chaîne.


N'oubliez pas que zipwithindex déclenche une itération supplémentaire via la collection, ce qui peut être résolu en utilisant Voir . Ainsi, au lieu de: Liste (2, 4, 6, 8, 10) .zipwithIdex.map (_. Swap) .Tomap Vous devez faire: Liste (2, 4, 6, 8, 10) .View.zipwithIdex.map (_. Swap) .Tomap



5
votes

upd upd: strong> Si vous souhaitez transformer les valeurs, vous pouvez utiliser l'une des solutions déjà affichées, puis utilisez le de la carte de la carte CODE> ou que vous pouviez Appliquez la transformation à l'avance:

List(2, 4, 6, 8, 10).zipWithIndex.map { case (v, i) => i -> List(v) }.toMap
res0: Map[Int,List[Int]] = Map(0 -> List(2), 1 -> List(4), 2 -> List(6), 3 -> List(8), 4 -> L
ist(10))


0 commentaires

17
votes
val xs = List(2, 4, 6, 8, 10)
(xs.indices zip xs).toMap
// Map(0 -> 2, 1 -> 4, 2 -> 6, 3 -> 8, 4 -> 10)

2 commentaires

Juste curieux: pensez-vous que c'est l'approche la plus efficace?


@Erikallik si vous voulez dire performance , je pense que cette main écrite alors que la boucle sera beaucoup plus efficace dans des boucles serrées, mais comme pour les autres solutions enrôlées ici (zipwithIdex base sur), il devrait montrer les mêmes caractéristiques de performance .