18 Stimmen

alle bis auf das letzte Element aus einem Scala-Iterator (auch bekannt als Iterator.init)

Ich habe eine Reihe von großen Dateien, bei denen ich alle Zeilen bis auf die letzte verarbeiten möchte. Wenn die Dateien klein wären, könnte ich einfach in ein TraversableLike konvertieren und die "init"-Methode verwenden, z. B.:

lines.toList.init

Aber die Dateien sind groß, so dass ich die Dinge als Iterator behalten muss. Gibt es eine einfache Möglichkeit, so etwas wie "init" auf einen Iterator zu erhalten? Ich erwäge die folgenden, aber ich bin nicht zuversichtlich, es wird immer funktionieren:

lines.takeWhile(_ => lines.hasNext)

15voto

Rex Kerr Punkte 164629

Sie verlassen sich auf takeWhile Zuerst wird die nächste Zeile gegriffen und dann geprüft, ob es eine weitere Zeile gibt. Im Standard-Iterator funktioniert es auf diese Weise. Und für jede bestimmte Iterator, ich erwarte, dass, wenn es jemals funktioniert, es sollte immer funktionieren.

Wenn es jemals fehlschlägt, müssen Sie das Ergebnis zwischenspeichern. Sie könnten Ihren eigenen Iterator erstellen, der dies tut, oder, einfacher (wenn es sich nicht um dringend leistungsrelevanten Code handelt):

lines.sliding(2).map(_.head)

Probieren Sie dies wie folgt aus:

List(1,2,3,4,5).iterator.sliding(2).map(_.head).toList

Sie müssen sich nicht auf takeWhile oder eine andere Methode, die sich auf eine bestimmte Weise verhält; wenn sliding nicht gebrochen ist, verhält es sich wie oben beschrieben.

0 Stimmen

Toll! Ich musste ein bisschen darauf starren, um zu erkennen, warum es funktioniert, aber es scheint weniger hakelig als meine Lösung =)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X