6

インスタンスを処理するクラスPointと関数があるとしますPoint

クラスポイント{プライベートファイナルint x、y; ... }
...
void handlePoints(Iterable<Point> points) { for (Point p: points) {...} }

今、私はファイルから読みたいと思いpointsます。ファイルの各行には 2 つの数値が含まれているためpoint、行から を作成する関数 (「ファクトリー メソッド」) があります。

ポイント makePoint(文字列行) { ... }

私は今どうすればいい?ファイルをリストに読み取り、関数をpoints呼び出す関数を作成できhandlePointsます。

List<Point> readPoints(BufferedReader reader) {...} // ここで makePoint を使用

void handlePoints(BufferedReader リーダー) {
   List<Point> ポイント = readPoints(リーダー);
   handlePoints(ポイント);
}

残念ながら、この関数はメモリ内にポイントの不要なリストを作成するため、特に洗練されているようには見えません。

イテレータを使用するほうがよいのではないでしょうか?

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

Iterator<Point> readPoints(BufferedReader reader) {...} // ここで makePoint を使用

void handlePoints(BufferedReader リーダー) {
   Iterator<Point> points = readPoints(リーダー);
   handlePoints(ポイント);
}

それは理にかなっていますか?Java では、このコードはあまりにも「うるさい」のではないでしょうか?

4

3 に答える 3

9

すべてのポイントをメモリ内に保持する必要がない場合は、次のような方法を考えてください。

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

iterator と 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

ファイルから毎回読み取るのではなく、ファイルから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 に答える