迭代器用Java读取和处理文件
假设我有一个Point
类和一个处理Point
实例的函数
class Point {private final int x,y; ...} ... void handlePoints(Iterable points){for(Point p:points){...}}
现在我想从文件中读取points
。 该文件的每一行包含两个数字,因此我有一个函数(“工厂方法”)来从一行创建一个point
。
点makePoint(String line){...}
我现在应该怎么做? 我可以编写一个函数来将文件读取到一个points
列表并调用handlePoints
函数。
List readPoints(BufferedReader reader){...} //在这里使用makePoint void handlePoints(BufferedReader reader){ List points = readPoints(reader); handlePoints(分); }
不幸的是,这个function似乎并不特别优雅,因为它在内存中创建了一个不必要的点列表。
使用迭代器不是更好吗?
void handlePoints(Iterator points){...} Iterator readPoints(BufferedReader reader){...} //在这里使用makePoint void handlePoints(BufferedReader reader){ Iterator points = readPoints(reader); handlePoints(分); }
是否有意义? 这段代码在Java中不会太“吵”吗?
如果你不需要记忆中的所有点,那么请考虑以下几点:
while (reader.ready()) { String line = reader.readLine(); Point point = makePoint(line); handlePoint(point); }
如何使用迭代器和handlePoints执行此操作:(用于处理要添加的exception的代码)
class PointIterator implements Iterator { BufferedReader reader; PointIterator(BufferedReader myReader) { reader = myReader; }; @Override public boolean hasNext() { return myReader.ready(); }; @Override public Point next() { return makePoint(myReader.readLine()); }; @Override public void remove() { throw new UnsupportedOperationException("Remove not supported!"); }; }
因为handlePoints
采用Iterable
:
class PointIterable implements Iterable { BufferedReader reader; public PointIterable(BufferedReader myReader) { reader = myReader; }; @Override public Iterator iterator() { return new PointIterator(reader); } }
使用:
handlePoints(new PointIterable(reader));
从内存的角度来看,你不会通过使用迭代器来真正保存任何内存 – 我猜你会把所有的点都读到内存中,所以它们都必须以某种方式存储。
迭代器不是一个不同的集合类型:它只是一种迭代集合的不同方式。 例如,您可以使用list.iterator()
来获取循环遍历列表(或任何集合)的迭代器。
选择用于保存内存中所有点的集合是影响内存的集合(例如, ArrayList
与LinkedList
)。
只需从文件中读取一次并将其放在内存中,而不是每次从文件中读取
List points ; public List readPoints(BufferedReader reader) { if(points == null) { points = new ArrayList(); // read from file and populate points.add(point) ; } return points; }