Durchlaufen Mitglieder von collection in Scala
Was ist ein effizienter Weg, um zu Durchlaufen und nur die Mitglieder einer collection in Scala, basierend auf index-position?
Angesichts dieser Liste:
val fruits: List[String] = List("apples", "oranges", "pears", "bananas")
Möchte ich überspringen, äpfel und Birnen, und den Prozess, Orangen und Bananen. Danke!
Update-basierend auf den Antworten gegeben:
Wow, jeder der top-drei-Antworten Verdienst. Ich bedeutete ursprünglich das Wort "effizient" aus einer Scala-Collections syntax Perspektive, und ich war eigentlich nur auf der Suche für einen glatten Weg, um die Unterliste für die nachfolgende iteration. @Senia macht einen guten job die Einführung der Schiebetür () - Funktion, ideal für diesen Anwendungsfall, aber ich habe auch wie @Brian mehr verallgemeinerte Ansatz mit zipWithIndex().
Allerdings, wenn ich den tatsächlichen Wortlaut der Frage als die ursprünglich gestellte, und die rechnerische Effizienz von @sourcedelica die Antwort, ich denke er nimmt den Preis für diese ein.
- Keine der Antworten so weit interate durch die Mitglieder. Stattdessen produzieren Sie eine Liste der Mitglieder (die dann iteriert über, natürlich). Es muss eine einfache Möglichkeit, direkt Durchlaufen ove Sie, obwohl?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine Möglichkeit, direkt zu iterieren über die ungeraden:
Wenn es eine große Sammlung und/oder Sie werden tun eine Menge der Iterationen, dann werden Sie wollen prüfen, konvertieren es zu einem
IndexedSeq
erste, also diefruits(_)
ist O(1). Zum Beispiel:Beachten Sie, dass der iterator selbst ist getrennt von der Sammlung, die es Durchlaufen. Hier ist ein weiteres Beispiel macht das klar:
zipWithIndex Paare jedes element in der Liste mit einem index zu geben:
List[(String, Int)] = List((apples,0), (oranges,1), (pears,2), (bananas,3))
filtern der ungeraden Elemente mit
filter(_._2 % 2 == 1)
geben:List[(String, Int)] = List((oranges,1), (bananas,3))
anzeigen der Liste[(String, Int)], um nur eine Liste[String] indem das erste element jedes Tupels mit
.map(_._1)
geben:List[String] = List(oranges, bananas)
filter
gefolgt von einemmap
können Sie kombinieren Sie mitcollect
z.B.fruits.zipWithIndex.collect{case(item,idx) if idx % 2 == 1 => item}
Ich würde vorschlagen, eine andere Methode, mit Rekursion, die zu machen scheint, so wenig Operationen wie möglich in meiner Meinung nach, auch wenn es weniger Phantasie als andere Lösungen.
Oder, wenn Sie wollen einfach nur zu verarbeiten, Mitglieder
Noch eine andere alternative, basierend auf einer Kombination von
List::gruppiert
um der partition Elemente von pair-Mädchen (die bietet eine einfache Möglichkeit für den Zugriff auf Elemente in merkwürdigen Stellungen) undIterator::collect
um Sammlungen mit ungerade Länge:Liste.range(0,5) ergibt die Liste(0,1,2,3,4)
Können wir generieren Liste von Indizes und wir können die filter
scala> val Früchte: List[String] = List("äpfel", "Orangen", "Birnen", "Bananen")
scala> Liste.range(0,Früchte.Länge).filter(_%2!=0).map(x=>Obst(x))
res0: List[String] = List(Orangen, Bananen)