イテレータの使用方法と使用場所
イテレータ インターフェイスのオブジェクトを使用して、コレクションのすべての要素をトラバースできます。反復子を使用してコレクション内のデータを検査することはできますが、基になるコレクションを変更するために使用することはできません。一般に、反復子を使用してコレクションの内容を循環するには、次の手順を実行する必要があります。
- コレクションの iterator メソッドを呼び出して、コレクションの先頭への反復子を取得します。
- hasNext メソッドを呼び出すループを設定します。 hasNext メソッドが true を返す限り、ループを繰り返します。
- ループ内で、next メソッドを呼び出して各要素を取得します。
Aspose.Cells API には多数のイテレータが用意されていますが、この記事では主に以下に示す 3 つのタイプについて説明します。
- Cells イテレータ
- 行反復子
- 列イテレータ
イテレータの使い方
Cells イテレータ
セルの反復子にアクセスするにはさまざまな方法があり、アプリケーションの要件に基づいてこれらの方法のいずれかを使用できます。セルの反復子を返すメソッドは次のとおりです。
- Cells.iterator
- Row.iterator
- Range.iterator
上記のメソッドはすべて、初期化されたセルのコレクションをトラバースできるイテレータを返します。
次のコード例は、セル コレクションの Iterator クラスの実装を示しています。
// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java | |
String dataDir = Utils.getDataDir(CellsIterator.class); | |
// Load a file in an instance of Workbook | |
Workbook book = new Workbook(dataDir + "sample.xlsx"); | |
// Get the iterator from Cells collection | |
Iterator cellIterator = book.getWorksheets().get(0).getCells().iterator(); | |
// Traverse cells in the collection | |
while (cellIterator.hasNext()) { | |
Cell cell = (Cell) cellIterator.next(); | |
; | |
System.out.println(cell.getName() + " " + cell.getValue()); | |
} | |
// Get iterator from an object of Row | |
Iterator rowIterator = book.getWorksheets().get(0).getCells().getRows().get(0).iterator(); | |
// Traverse cells in the given row | |
while (rowIterator.hasNext()) { | |
Cell cell = (Cell) rowIterator.next(); | |
System.out.println(cell.getName() + " " + cell.getValue()); | |
} | |
// Get iterator from an object of Range | |
Iterator rangeIterator = book.getWorksheets().get(0).getCells().createRange("A1:B10").iterator(); | |
// Traverse cells in the range | |
while (rangeIterator.hasNext()) { | |
Cell cell = (Cell) rangeIterator.next(); | |
System.out.println(cell.getName() + " " + cell.getValue()); | |
} |
行反復子
Rows Iterator は、RowCollection.iterator メソッドの使用中にアクセスできます。次のコード例は、RowCollection クラスの Iterator の実装を示しています。
// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java | |
String dataDir = Utils.getDataDir(RowsIterator.class); | |
// Load a file in an instance of Workbook | |
Workbook book = new Workbook(dataDir + "sample.xlsx"); | |
// Get the iterator for RowCollection | |
Iterator rowsIterator = book.getWorksheets().get(0).getCells().getRows().iterator(); | |
// Traverse rows in the collection | |
while (rowsIterator.hasNext()) { | |
Row row = (Row) rowsIterator.next(); | |
System.out.println(row.getIndex()); | |
} |
列イテレータ
ColumnCollection.iterator メソッドの使用中に、Columns Iterator にアクセスできます。次のコード例は、ColumnCollection クラスの Iterator の実装を示しています。
イテレータを使用する場所
イテレータを使用する利点を説明するために、リアルタイムの例を見てみましょう。
シナリオ
アプリケーションの要件は、特定のワークシート内のすべてのセルをトラバースしてそれらの値を読み取ることです。この目標を実現するには、いくつかの方法があります。いくつかを以下に示します。
表示範囲の使用
// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java | |
String dataDir = Utils.getDataDir(UsingDisplayRange.class); | |
// Load a file in an instance of Workbook | |
Workbook book = new Workbook(dataDir + "sample.xlsx"); | |
// Get Cells collection of first worksheet | |
Cells cells = book.getWorksheets().get(0).getCells(); | |
// Get the MaxDisplayRange | |
Range displayRange = cells.getMaxDisplayRange(); | |
// Loop over all cells in the MaxDisplayRange | |
for (int row = displayRange.getFirstRow(); row < displayRange.getRowCount(); row++) { | |
for (int col = displayRange.getFirstColumn(); col < displayRange.getColumnCount(); col++) { | |
// Read the Cell value | |
System.out.println(displayRange.get(row, col).getStringValue()); | |
} | |
} |
MaxDataRow と MaxDataColumn の使用
上記のアプローチの両方が多かれ少なかれ類似したロジックを使用していることがわかります。コレクション内のすべてのセルをループして、セルの値を読み取ります。これは、以下で説明するように、いくつかの理由で問題になる可能性があります。
- MaxRow、MaxDataRow、MaxColumn、MaxDataColumn、MaxDisplayRange などの API は、対応する統計を収集するために余分な時間を必要とします。データ マトリックス (行 x 列) が大きい場合、これらの API を使用すると、パフォーマンスが低下する可能性があります。
- ほとんどの場合、特定の範囲内のすべてのセルがインスタンス化されるわけではありません。このような状況では、マトリックス内のすべてのセルをチェックすることは、初期化されたセルのみをチェックする場合に比べて効率的ではありません。
- Cells.get(rowIndex, columnIndex) としてループ内のセルにアクセスすると、範囲内のすべてのセル オブジェクトがインスタンス化され、最終的に OutOfMemoryError が発生する可能性があります。
結論
上記の事実に基づいて、イテレータを使用する必要があるシナリオを次に示します。
- セル コレクションの読み取り専用アクセスが必要です。要件は、セルのみを検査することです。
- 多数のセルが横断されます。
- 初期化されたセル/行/列のみがトラバースされます。