¿Hay alguna Lista / Secuencia incorporada que se comporte map
y proporcione también el índice del elemento?
99
¿Hay alguna Lista / Secuencia incorporada que se comporte map
y proporcione también el índice del elemento?
Creo que estás buscando 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
También tienes variaciones como:
for((e,i) <- List("Mary", "had", "a", "little", "lamb").zipWithIndex) println(i+" "+e)
o:
List("Mary", "had", "a", "little", "lamb").zipWithIndex.foreach( (t) => println(t._2+" "+t._1) )
zipWithIndex
método para obtener el índice dentro de un bucle / mapa / lo que sea.while
bucle, que probablemente se encuentre entre las opciones más rápidas.view
usted debería poder evitar crear y atravesar una Lista adicional.Utilizar . mapa en. zipWithIndex
Resultado:
fuente
map
archivo tal como se solicitó en lugar de solo imprimir dentro de un archivoforeach
.Las soluciones propuestas adolecen del hecho de que crean colecciones intermedias o introducen variables que no son estrictamente necesarias. Porque, en última instancia, todo lo que necesita hacer es realizar un seguimiento del número de pasos de una iteración. Esto se puede hacer mediante la memorización. El código resultante podría verse así
La
doIndexed
-Función envuelve la función interior que recibe tanto un índice como los elementos demyIterable
. Esto puede resultarle familiar gracias a JavaScript.He aquí una forma de lograr este propósito. Considere la siguiente utilidad:
Esto ya es todo lo que necesitas. Puede aplicar esto, por ejemplo, de la siguiente manera:
que resulta en la lista
De esta manera, puede usar las funciones habituales de Traversable a expensas de envolver su función efectiva. La sobrecarga es la creación del objeto de memorización y el contador que contiene. De lo contrario, esta solución es tan buena (o mala) en términos de memoria o rendimiento como el uso sin indexar
map
. ¡Disfrutar!fuente
coll.view.zipWithIndex
lugar decoll.zipWithIndex
Hay
CountedIterator
en 2.7.x (que puede obtener de un iterador normal con .counted). Creo que ha quedado obsoleto (o simplemente se ha eliminado) en 2.8, pero es bastante fácil lanzar el suyo. Necesita poder nombrar el iterador:fuente
O, asumiendo que su colección tiene un tiempo de acceso constante, podría mapear la lista de índices en lugar de la colección real:
fuente
ls.indices.map(i => doStuffWithElem(i, ls(i))
indices
se implementa,0 until length
es más o menos lo mismo: PList
fue realmente pobre. Sin embargo, mencioné que esto es adecuado si su colección tiene un tiempo de acceso constante. Debería haber elegidoArray
.Utilice .map en .zipWithIndex con estructura de datos de mapa
Resultados
fuente
Hay dos formas de hacer esto.
ZipWithIndex: crea un contador que comienza automáticamente con 0.
La salida de ambos códigos será:
Zip : use el método zip con un Stream para crear un contador. Esto le brinda una forma de controlar el valor inicial.
Resultado:
fuente
Si también necesita buscar los valores del mapa (como tuve que hacerlo):
fuente