scala skurril in diesem While-Loop-Code

7

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%     
smartnut007 21.07.2011, 00:23
quelle

4 Antworten

14

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":

%Vor%

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:

%Vor%     
0__ 21.07.2011, 00:36
quelle
5

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:

%Vor%

Und wenn Sie den println -Zähler beibehalten möchten, fügen Sie einen Index hinzu:

%Vor%

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.

    
Kevin Wright 21.07.2011 09:46
quelle
4

Beim zweiten Aufruf von lines.size wird 0 zurückgegeben. Dies liegt daran, dass lines ein Iterator ist, kein Array.

    
larissa 21.07.2011 00:37
quelle
4

Ich habe Ihren Code in Seq umgeschrieben, der in @ 0__ answer:

vorgeschlagen wurde %Vor%     
om-nom-nom 21.07.2011 00:51
quelle

Tags und Links