Gestern hat mir dieses Stück Code Kopfschmerzen bereitet. Ich habe es behoben, indem ich die Datei zeilenweise gelesen habe. Irgendwelche Ideen?
Die while-Schleife scheint nie ausgeführt zu werden, obwohl die Anzahl der Zeilen in der Datei größer als 1 ist.
%Vor% Das ist in der Tat schwierig, und ich würde sogar sagen, dass es ein Fehler in Iterator
ist. getLines
gibt eine Iterator
zurück, die träge weiterläuft. Wenn Sie also nach lines.size
fragen, durchläuft der Iterator die gesamte Datei, um die Zeilen zu zählen. Danach ist es "erschöpft":
Sie sehen, wenn Sie size
zweimal ausführen, ist das Ergebnis gleich Null.
Es gibt zwei Lösungen: Entweder erzwingen Sie den Iterator in etwas 'stabiles', wie lines.toSeq
. Oder du vergisst size
und führst die "normale" Iteration durch:
Keine der obigen Antworten trifft den Nagel auf den Kopf.
Es gibt einen guten Grund, warum hier ein Iterator
zurückgegeben wird. Wenn Sie faul sind, wird der Heap entlastet, und die Zeichenfolge, die jede Zeile darstellt, kann dann als Garbage Collected erfasst werden, sobald Sie damit fertig sind. Bei großen Dateien kann dies den Unterschied ausmachen, um eine OutOfMemoryException zu vermeiden.
Idealerweise würden Sie direkt mit dem Iterator arbeiten und ihn nicht in einen strikten Sammeltyp zwingen.
Verwenden von grouped
dann, wie von om-nom-nom's Antwort:
Und wenn Sie den println
-Zähler beibehalten möchten, fügen Sie einen Index hinzu:
Wenn Sie wirklich brauchen, rufen Sie getLines
zweimal auf. Einmal für die Zählung und ein zweites Mal, um die Linien tatsächlich zu bearbeiten.
Ich habe Ihren Code in Seq
umgeschrieben, der in @ 0__ answer:
Tags und Links scala