Gibt es eine integrierte Liste / Sequenz, die sich wie map
der Index des Elements verhält und diesen auch bereitstellt?
99
Gibt es eine integrierte Liste / Sequenz, die sich wie map
der Index des Elements verhält und diesen auch bereitstellt?
Ich glaube, Sie suchen nach 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
Von: http://www.artima.com/forums/flat.jsp?forum=283&thread=243570
Sie haben auch Variationen wie:
for((e,i) <- List("Mary", "had", "a", "little", "lamb").zipWithIndex) println(i+" "+e)
oder:
List("Mary", "had", "a", "little", "lamb").zipWithIndex.foreach( (t) => println(t._2+" "+t._1) )
zipWithIndex
Methode verwenden, um den Index in eine Schleife / Karte / was auch immer zu bekommen.while
Schleife, die wahrscheinlich zu den schnellsten Optionen gehört.view
Ihnen verhindern kann, dass eine zusätzliche Liste erstellt und durchlaufen wird.Verwenden . Karte in. zipWithIndex
Ergebnis:
quelle
map
wie gewünscht verwendet habe, anstatt nur in a zu druckenforeach
.Die vorgeschlagenen Lösungen leiden unter der Tatsache, dass sie Zwischensammlungen erstellen oder Variablen einführen, die nicht unbedingt erforderlich sind. Letztendlich müssen Sie nur die Anzahl der Schritte einer Iteration verfolgen. Dies kann durch Auswendiglernen erfolgen. Der resultierende Code könnte so aussehen
Die
doIndexed
-Funktion umschließt die innere Funktion, die sowohl einen Index als auch die Elemente von empfängtmyIterable
. Dies ist Ihnen möglicherweise aus JavaScript bekannt.Hier ist ein Weg, um diesen Zweck zu erreichen. Betrachten Sie das folgende Dienstprogramm:
Das ist schon alles was du brauchst. Sie können dies beispielsweise wie folgt anwenden:
was zu der Liste führt
Auf diese Weise können Sie die üblichen Traversable-Funktionen auf Kosten der Umhüllung Ihrer effektiven Funktion verwenden. Der Overhead ist die Erstellung des Memoizing-Objekts und des Zählers darin. Andernfalls ist diese Lösung in Bezug auf Speicher oder Leistung genauso gut (oder schlecht) wie die Verwendung von nicht indizierten
map
. Genießen!quelle
coll.view.zipWithIndex
anstelle voncoll.zipWithIndex
Es gibt
CountedIterator
in 2.7.x (was Sie von einem normalen Iterator mit .counted erhalten können). Ich glaube, es wurde in 2.8 veraltet (oder einfach entfernt), aber es ist einfach genug, um Ihre eigenen zu würfeln. Sie müssen den Iterator benennen können:quelle
Angenommen, Ihre Sammlung verfügt über eine konstante Zugriffszeit, können Sie die Liste der Indizes anstelle der tatsächlichen Sammlung zuordnen:
quelle
ls.indices.map(i => doStuffWithElem(i, ls(i))
indices
implementiert ist, da0 until length
es so ziemlich dasselbe ist: PList
war in der Tat schlecht. Ich habe jedoch erwähnt, dass dies geeignet ist, wenn Ihre Sammlung eine konstante Zugriffszeit hat. Hätte wählen sollenArray
.Verwenden Sie .map in .zipWithIndex mit Map-Datenstruktur
Ergebnisse
quelle
Es gibt zwei Möglichkeiten, dies zu tun.
ZipWithIndex: Erstellt automatisch einen Zähler, der mit 0 beginnt.
Die Ausgabe beider Codes lautet:
Zip : Verwenden Sie die Zip-Methode mit einem Stream, um einen Zähler zu erstellen. Auf diese Weise können Sie den Startwert steuern.
Ergebnis:
quelle
Wenn Sie auch die Kartenwerte durchsuchen müssen (wie ich musste):
quelle