Tout ce que je voulais faire, c'est convertir les éléments suivants: p>
Quelqu'un peut-il suggérer un moyen simple de le faire? P>
UPD: strong> 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 Liste (2, 4, 6, 8, 10) code> à
Carte (0 -> 2, 1 -> 4, 2 -> 6, 3 -> 8, 4 - > 10) code>. En d'autres termes, indice de carte à la valeur. Il devrait être très facile, mais je manque quelque chose. P>
(_) code>. Dans notre cas: p>
Liste (2, 4, 6, 8, 10) CODE> ->
Carte (0 -> Liste (2), 1 -> Liste (4), 2 -> Liste ( 6), 3 -> Liste (8), 4 -> Liste (10)) Code> P>
3 Réponses :
List(2, 4, 6, 8, 10).zipWithIndex.map(_.swap).toMap
BTW Le fait que .zipwithindex.tomap code> 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 i> sens.
Je préfère cela à la solution @ om-Nom-Nom, car elle ne nécessite pas de répéter le symbole XS code>. Ceci est important pour moi parce que j'essaie d'ajouter ceci à la fin d'une longue chaîne.
N'oubliez pas que zipwithindex code> déclenche une itération supplémentaire via la collection, ce qui peut être résolu en utilisant
Voir code>. Ainsi, au lieu de:
Liste (2, 4, 6, 8, 10) .zipwithIdex.map (_. Swap) .Tomap code> Vous devez faire:
Liste (2, 4, 6, 8, 10) .View.zipwithIdex.map (_. Swap) .Tomap code>
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))
val xs = List(2, 4, 6, 8, 10) (xs.indices zip xs).toMap // Map(0 -> 2, 1 -> 4, 2 -> 6, 3 -> 8, 4 -> 10)
Juste curieux: pensez-vous que c'est l'approche la plus efficace?
@Erikallik si vous voulez dire performance i>, 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 .
Pourquoi ne pas simplement le convertir en un
indexedseq code> (c'est-à-dire
myList.Oindexedseq code>)? 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 code> serait la meilleure solution.