イテレータの使用方法と場所
イテレータ インターフェースのオブジェクトを使用してコレクションのすべての要素を反復処理できます。イテレータはコレクションのデータを調査するために使用できますが、基礎となるコレクションを変更することはできません。一般的に、コレクションの内容をサイクルさせるためにイテレータを使用するには、以下の手順を実行する必要があります:
- コレクションの iterator メソッドを呼び出して、コレクションの先頭に対するイテレータを取得します。
- hasNext メソッドを呼び出して続行するループを設定します。hasNext メソッドが true を返す限り、ループを繰り返します。
- ループ内で、next メソッドを呼び出してそれぞれの要素を取得します。
Aspose.Cells API は多くのイテレータを提供していますが、この記事では主に以下にリストされている 3 種類について説明します。
- セル イテレータ
- 行 イテレータ
- 列 イテレータ
反復子の使用方法
セル反復子
セルの反復子にアクセスする方法はさまざまであり、アプリケーションの要件に基づいてこれらの方法のいずれかを使用することができます。 以下に、セルの反復子を返すメソッドが示されています。
- Cells.iterator
- Row.iterator
- Range.iterator
上記のすべての方法は、初期化されたセルのコレクションを走査することを可能にする反復子を返します。
次のコード例は、セルコレクションの反復子の実装を示しています。
行の反復子
RowCollection.iterator メソッドを使用すると、行の反復子にアクセスできます。 以下のコード例は、RowCollection クラスの反復子の実装を示しています。
列の反復子
ColumnCollection.iterator メソッドを使用すると、列の反復子にアクセスできます。 以下のコード例は、ColumnCollection クラスの反復子の実装を示しています。
反復子の使用場所
反復子を使用する利点について議論するために、実際の例を取り上げましょう。
シナリオ
アプリケーションの要件は、指定されたワークシート内のすべてのセルを走査してそれらの値を読むことです。 この目標を実装するためのいくつかの方法があります。 そのうちのいくつかを以下で示します。
表示範囲を使用する
MaxDataRowおよびMaxDataColumnを使用する
上記の2つのアプローチともに、コレクション内のすべてのセルをループしてセルの値を読み取るというロジックを使用していることがわかります。 以下で説明する理由により、これはいくつかの理由で問題があるかもしれません。
- MaxRow、MaxDataRow、MaxColumn、MaxDataColumn、および MaxDisplayRange などの API は、対応する統計情報を収集するための余分な時間を要求します。 データマトリックス(行×列)が大きい場合、これらの API を使用するとパフォーマンスにペナルティが課せられる可能性があります。
- ほとんどの場合、指定された範囲内のすべてのセルがインスタンス化されていません。そのような状況では、行列内のすべてのセルを確認することは、初期化されたセルのみを確認する場合と比べて効率的ではありません。
- Cells.get(rowIndex, columnIndex) をループ内でアクセスすると、範囲内のすべてのセルオブジェクトが初期化されるため、最終的に OutOfMemoryError が発生する可能性があります。
結論
上記の事実に基づいて、反復子を使用すべき可能性のあるシナリオは次のとおりです。
- セルコレクションの読み取り専用アクセスが必要な場合、つまり、セルを検査するだけの要求がある場合。
- 多数のセルを走査する必要がある場合。
- 初期化されたセル/行/列のみを走査する必要がある場合。