6

假设我有一个类Point和一个函数来处理Point实例

类点 { 私有最终 int x, y; ... }
...
void handlePoints(Iterable<Point> points) { for (Point p: points) {...} }

现在我想points从文件中读取。文件的每一行都包含两个数字,所以我有一个函数(“工厂方法”)来point从一行创建一个。

点 m​​akePoint(String line) { ... }

我现在该怎么办?我可以编写一个函数来将文件读取到列表中points并调用该handlePoints函数。

List<Point> readPoints(BufferedReader reader) {...} // 在这里使用 makePoint

无效句柄点(BufferedReader 阅读器){
   List<Point> points = readPoints(reader);
   处理点(点);
}

不幸的是,这个函数看起来并不是特别优雅,因为它在内存中创建了一个不必要的点列表。

使用迭代器不是更好吗?

void handlePoints(Iterator<Point> points) {...}

Iterator<Point> readPoints(BufferedReader reader) {...} // 这里使用 makePoint

无效句柄点(BufferedReader 阅读器){
   迭代器<Point> 点 = readPoints(reader);
   处理点(点);
}

是否有意义?这段代码在 Java 中不会太“嘈杂”吗?

4

3 回答 3

9

如果您不需要将所有点都保存在内存中,请考虑以下更多内容:

while (reader.ready())
{
  String line = reader.readLine();
  Point point = makePoint(line);
  handlePoint(point);
}

如何使用迭代器和 handlePoints 执行此操作:(要添加的异常处理代码)

class PointIterator implements Iterator<Point>
{
  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<Point>
{
  BufferedReader reader;
  public PointIterable(BufferedReader myReader) { reader = myReader; };
  @Override
  public Iterator<Point> iterator() { return new PointIterator(reader); }
}

要使用:

handlePoints(new PointIterable(reader));
于 2013-01-01T11:24:27.147 回答
1

从内存的角度来看,您不会通过使用迭代器真正节省任何内存 - 我猜您会将所有点读入内存,因此它们都必须以某种方式存储。

迭代器不是不同的集合类型:它只是迭代集合的不同方式。例如,您可以list.iterator()获取一个迭代器来遍历您的列表(或任何集合)。

选择使用什么集合来保存内存中的所有点是会影响内存的(例如ArrayListvs. LinkedList)。

于 2013-01-01T11:18:50.023 回答
1

只需从文件中读取一次并将其保存在内存中,而不是每次都从文件中读取

List<Points> points ;

public List<Point> readPoints(BufferedReader reader) {
     if(points == null) {
        points = new ArrayList();
        // read from file and populate 
        points.add(point) ;
     }
 return points;
} 
于 2013-01-01T11:30:33.893 回答