Как и где использовать итераторы

Как использовать итераторы

Cells Итератор

Существуют различные способы доступа к итератору ячеек, и любой из этих методов можно использовать в зависимости от требований приложения. Вот методы, которые возвращают итератор ячеек.

  1. Cells.iterator
  2. Строка.итератор
  3. 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());
}
Итератор строк

Доступ к итератору строк можно получить при использовании метода RowCollection.iterator. В следующем примере кода демонстрируется реализация класса Iterator для RowCollection.

// 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. В следующем примере кода демонстрируется реализация класса Iterator для ColumnCollection.

// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java
String dataDir = Utils.getDataDir(ColumnsIterator.class);
// Load a file in an instance of Workbook
Workbook book = new Workbook(dataDir + "sample.xlsx");
// Get the iterator for ColumnsCollection
Iterator colsIterator = book.getWorksheets().get(0).getCells().getColumns().iterator();
// Traverse columns in the collection
while (colsIterator.hasNext()) {
Column col = (Column) colsIterator.next();
System.out.println(col.getIndex());
}

Где использовать итераторы

Чтобы обсудить преимущества использования итераторов, давайте рассмотрим пример в реальном времени.

Сценарий

Требование к приложению состоит в том, чтобы пройти по всем ячейкам данного рабочего листа, чтобы прочитать их значения. Способов реализации этой цели может быть несколько. Некоторые из них показаны ниже.

Использование диапазона отображения
// 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
// For complete examples and data files, please go to https://github.com/aspose-cells/Aspose.Cells-for-Java
String dataDir = Utils.getDataDir(UsingMaxDataRowAndMaxDataColumn.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();
// Loop over all cells
for (int row = 0; row < cells.getMaxDataRow(); row++) {
for (int col = 0; col < cells.getMaxDataColumn(); col++) {
// Read the Cell value
System.out.println(cells.get(row, col).getStringValue());
}
}

Как вы можете заметить, оба вышеупомянутых подхода используют более или менее схожую логику, то есть; цикл по всем ячейкам в коллекции, чтобы прочитать значения ячеек. Это может быть проблематично по ряду причин, как описано ниже.

  1. Такие API, как MaxRow, MaxDataRow, MaxColumn, MaxDataColumn и MaxDisplayRange, требуют дополнительного времени для сбора соответствующей статистики. Если матрица данных (строки x столбцы) велика, использование этих API может привести к снижению производительности.
  2. В большинстве случаев создаются не все ячейки в заданном диапазоне. В таких ситуациях проверять каждую ячейку матрицы не так эффективно, как проверять только инициализированные ячейки.
  3. Доступ к ячейке в цикле как Cells.get(rowIndex, columnIndex) приведет к созданию экземпляров всех объектов ячеек в диапазоне, что в конечном итоге может вызвать OutOfMemoryError.
Заключение

Основываясь на вышеупомянутых фактах, ниже приведены возможные сценарии использования итераторов.

  1. Требуется доступ только для чтения к коллекции ячеек, т.е. Требование состоит в том, чтобы осматривать только ячейки.
  2. Необходимо пройти большое количество клеток.
  3. Только инициализированные ячейки/строки/столбцы должны быть пройдены.