Y a-t-il une liste / séquence intégrée qui se comporte comme map
et fournit également l'index de l'élément?
99
Y a-t-il une liste / séquence intégrée qui se comporte comme map
et fournit également l'index de l'élément?
Je crois que vous recherchez zipWithIndex?
scala> val ls = List("Mary", "had", "a", "little", "lamb")
scala> ls.zipWithIndex.foreach{ case (e, i) => println(i+" "+e) }
0 Mary
1 had
2 a
3 little
4 lamb
De: http://www.artima.com/forums/flat.jsp?forum=283&thread=243570
Vous avez également des variantes comme:
for((e,i) <- List("Mary", "had", "a", "little", "lamb").zipWithIndex) println(i+" "+e)
ou:
List("Mary", "had", "a", "little", "lamb").zipWithIndex.foreach( (t) => println(t._2+" "+t._1) )
zipWithIndex
méthode pour obtenir l'index dans une boucle / map / peu importe.while
boucle, qui est probablement parmi les options les plus rapides.view
vous devrait être en mesure d'empêcher la création et la traversée d'une liste supplémentaire.Utilisation . carte en. zipWithIndex
Résultat:
la source
map
comme demandé au lieu de simplement imprimer dans un fichierforeach
.Les solutions proposées souffrent du fait qu'elles créent des collections intermédiaires ou introduisent des variables qui ne sont pas strictement nécessaires. En fin de compte, tout ce que vous avez à faire est de suivre le nombre d'étapes d'une itération. Cela peut être fait en utilisant la mémorisation. Le code résultant pourrait ressembler à
La fonction
doIndexed
-Function enveloppe la fonction intérieure qui reçoit à la fois un index et les éléments demyIterable
. Cela peut vous être familier à partir de JavaScript.Voici un moyen d'atteindre cet objectif. Considérez l'utilitaire suivant:
C'est déjà tout ce dont vous avez besoin. Vous pouvez appliquer ceci par exemple comme suit:
qui aboutit à la liste
De cette façon, vous pouvez utiliser les fonctions Traversable habituelles au détriment de l'emballage de votre fonction effective. La surcharge est la création de l'objet de mémorisation et du compteur qui s'y trouve. Sinon, cette solution est aussi bonne (ou mauvaise) en termes de mémoire ou de performances que l'utilisation de non indexé
map
. Prendre plaisir!la source
coll.view.zipWithIndex
place decoll.zipWithIndex
Il existe
CountedIterator
en 2.7.x (que vous pouvez obtenir à partir d'un itérateur normal avec .counted). Je pense qu'il est obsolète (ou simplement supprimé) dans la version 2.8, mais il est assez facile de lancer le vôtre. Vous devez être en mesure de nommer l'itérateur:la source
Ou, en supposant que votre collection a un temps d'accès constant, vous pouvez mapper la liste des index au lieu de la collection réelle:
la source
ls.indices.map(i => doStuffWithElem(i, ls(i))
indices
est implémenté,0 until length
c'est à peu près la même chose: PList
était vraiment médiocre. J'ai cependant mentionné que cela convient si votre collection a un temps d'accès constant. J'aurais dû choisirArray
.Utilisez .map dans .zipWithIndex avec la structure de données Map
Résultats
la source
Il y a deux façons de le faire.
ZipWithIndex: crée un compteur commençant automatiquement par 0.
La sortie des deux codes sera:
Zip : utilisez la méthode zip avec un Stream pour créer un compteur. Cela vous donne un moyen de contrôler la valeur de départ.
Résultat:
la source
Si vous avez également besoin de rechercher les valeurs de la carte (comme je devais le faire):
la source