Как и где использовать итераторы
Объект интерфейса итератора можно использовать для обхода всех элементов коллекции. Итераторы можно использовать для проверки данных в коллекции, но их нельзя использовать для изменения базовой коллекции. В общем случае, чтобы использовать итератор для циклического просмотра содержимого коллекции, необходимо выполнить следующие шаги:
- Получите итератор в начало коллекции, вызвав метод итератора коллекции.
- Настройте цикл, который вызывает метод hasNext. Цикл повторяется до тех пор, пока метод hasNext возвращает значение true.
- В цикле получите каждый элемент, вызвав метод next.
Aspose.Cells API предоставляют множество итераторов, однако в этой статье в основном обсуждаются три типа, перечисленные ниже.
- Cells Итератор
- Итератор строк
- Итератор столбцов
Как использовать итераторы
Cells Итератор
Существуют различные способы доступа к итератору ячеек, и любой из этих методов можно использовать в зависимости от требований приложения. Вот методы, которые возвращают итератор ячеек.
- Cells.iterator
- Строка.итератор
- Range.iterator
Все вышеупомянутые методы возвращают итератор, который позволяет пройти по коллекции ячеек, которые были инициализированы.
В следующем примере кода демонстрируется реализация класса Iterator для коллекции ячеек.
Итератор строк
Доступ к итератору строк можно получить при использовании метода RowCollection.iterator. В следующем примере кода демонстрируется реализация класса Iterator для RowCollection.
Итератор столбцов
Доступ к итератору столбцов можно получить при использовании метода ColumnCollection.iterator. В следующем примере кода демонстрируется реализация класса Iterator для ColumnCollection.
Где использовать итераторы
Чтобы обсудить преимущества использования итераторов, давайте рассмотрим пример в реальном времени.
Сценарий
Требование к приложению состоит в том, чтобы пройти по всем ячейкам данного рабочего листа, чтобы прочитать их значения. Способов реализации этой цели может быть несколько. Некоторые из них показаны ниже.
Использование диапазона отображения
Использование MaxDataRow и MaxDataColumn
Как вы можете заметить, оба вышеупомянутых подхода используют более или менее схожую логику, то есть; цикл по всем ячейкам в коллекции, чтобы прочитать значения ячеек. Это может быть проблематично по ряду причин, как описано ниже.
- Такие API, как MaxRow, MaxDataRow, MaxColumn, MaxDataColumn и MaxDisplayRange, требуют дополнительного времени для сбора соответствующей статистики. Если матрица данных (строки x столбцы) велика, использование этих API может привести к снижению производительности.
- В большинстве случаев создаются не все ячейки в заданном диапазоне. В таких ситуациях проверять каждую ячейку матрицы не так эффективно, как проверять только инициализированные ячейки.
- Доступ к ячейке в цикле как Cells.get(rowIndex, columnIndex) приведет к созданию экземпляров всех объектов ячеек в диапазоне, что в конечном итоге может вызвать OutOfMemoryError.
Заключение
Основываясь на вышеупомянутых фактах, ниже приведены возможные сценарии использования итераторов.
- Требуется доступ только для чтения к коллекции ячеек, т.е. Требование состоит в том, чтобы осматривать только ячейки.
- Необходимо пройти большое количество клеток.
- Только инициализированные ячейки/строки/столбцы должны быть пройдены.