Come utilizzare un indice di autoincremento in per la comprensione in Scala
-
27-10-2019 - |
Domanda
È possibile utilizzare un contatore di autoincremento per le comprensioni in Scala?
qualcosa di simile a
for (element <- elements; val counter = counter+1) yield NewElement(element, counter)
Soluzione
Credo che tu stia cercando zipWithIndex
Metodo disponibile su Elenco e altre collezioni. Ecco un piccolo esempio del suo utilizzo:
scala> val list = List("a", "b", "c")
list: List[java.lang.String] = List(a, b, c)
scala> list.zipWithIndex
res0: List[(java.lang.String, Int)] = List((a,0), (b,1), (c,2))
scala> list.zipWithIndex.map{case (elem, idx) => elem + " with index " + idx}
res1: List[java.lang.String] = List(a with index 0, b with index 1, c with index 2)
scala> for ((elem, idx) <- list.zipWithIndex) yield elem + " with index " + idx
res2: List[java.lang.String] = List(a with index 0, b with index 1, c with index 2)
Altri suggerimenti
A per la comprensione non è come un ciclo per il fatto che i termini sono valutati per ciascun termine precedente. Ad esempio, guarda i risultati seguenti. Non penso che sia quello che stai cercando:
scala> val elements = List("a", "b", "c", "d")
elements: List[java.lang.String] = List(a, b, c, d)
scala> for (e <- elements; i <- 0 until elements.length) yield (e, i)
res2: List[(java.lang.String, Int)] = List((a,0), (a,1), (a,2), (a,3), (b,0), (b,1), (b,2), (b,3), (c,0), (c,1), (c,2), (c,3), (d,0), (d,1), (d,2), (d,3))
La risposta di Tenshi è probabilmente più sulla buona strada con il risultato desiderato, ma spero che questo controesempio sia utile.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow