Iteratoren zu Lesen und zu verarbeiten-Datei in Java
Angenommen ich habe eine Klasse Point
und eine Funktion zum verarbeiten Point
Instanzen
class Point { private final int x, y; ... } ... void handlePoints(Durchsuchbar<Punkt> Punkte) { for (Punkt p: Punkte) {...} }
Nun würde ich gerne Lesen points
aus einer Datei. Jede Zeile der Datei enthält zwei zahlen, so habe ich eine Funktion ("factory-Methode") zu erstellen point
aus einer Linie.
Point makePoint(String line) { ... }
Was soll ich jetzt tun? Kann ich eine Funktion schreiben, die Datei zu Lesen, um eine Liste der points
aus und rufen Sie den handlePoints
Funktion.
Liste<Punkt> readPoints(BufferedReader reader) {...} //Verwendung makePoint hier void handlePoints(BufferedReader reader) { Liste<Punkt> Punkte = readPoints(reader); handlePoints(Punkte); }
Leider ist diese Funktion scheint nicht besonders elegant, da schafft es eine unnötige Liste der Punkte in Erinnerung.
Wäre es nicht besser zu verwenden Iteratoren ?
void handlePoints(Iterator<Punkt> Punkte) {...} Iterator<Punkt> readPoints(BufferedReader reader) {...} //Verwendung makePoint hier void handlePoints(BufferedReader reader) { Iterator<Punkt> Punkte = readPoints(reader); handlePoints(Punkte); }
Macht es Sinn? Nicht diesen code zu "laut" in Java?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nicht brauchen, um alle Punkte in Gedächtnis, denken, der etwas mehr in diese Richtung:
Wie dies mit einem iterator und handlePoints: (code zur Behandlung von Ausnahmen ergänzt werden)
Und weil
handlePoints
nimmt eineIterable
:Verwenden:
handlePoints
behandelt alle Punkte zusammen.FileUtils.lineIterator(file, "UTF-8")
Methode gibt eineLineIterator
. Sie müssen in der Nähe der LineIterator sobald Sie fertig sind. Zuordnung der Zeile auf das Java-Objekt ist immer noch wie oben. Siehe hier: commons.apache.org/proper/commons-io/javadocs/api-release/...From a memory Sicht, werden Sie nicht wirklich speichern, jeder Speicher durch die Verwendung von Iteratoren - ich vermute, Sie werden das Lesen Sie alle Punkte in den Speicher, so werden Sie alle gespeichert werden müssen, irgendwie.
Einen iterator, der nicht in einer anderen collection-Typ: es ist einfach eine andere Art der Iteration über eine collection. Zum Beispiel könnten Sie gehen
list.iterator()
um einen iterator, um eine Schleife durch die Liste (oder eine Auflistung).Die Wahl, was die Sammlung zu verwenden, um zu halten, alle Punkte in die Erinnerung ist das eine, die Auswirkungen auf die Speicher (zB.
ArrayList
vs.LinkedList
).iterator
liest eine Zeile aufnext
und wandelt es in einPoint
Instanz.Iterator
- Schnittstelle, nimmt derFile
im Konstruktor und liest die nächste Zeile in dernext()
MethodeNur einmal gelesen aus Datei und haben es in den Speicher zu Lesen, anstatt jedes mal aus der Datei