Hur och var man ska använda iteratorer
Ett objekt av en iteratorgränssnitt kan användas för att traversera genom alla element i en samling. Iteratorer kan användas för att inspektera datan i en samling, men de kan inte användas för att modifiera den underliggande samlingen. Generellt sett måste följande steg tas för att använda en iterator för att cykla genom innehållet i en samling:
- Få en iterator till början av samlingen genom att ringa samlingens iterator-metod.
- Sätt upp en loop som gör ett anrop till hasNext-metoden. Låt loopen iterera så länge hasNext-metoden returnerar true.
- Inom loopen, hämta varje element genom att ringa nästa metod.
Aspose.Cells API:er tillhandahåller en mängd iteratorer, men den här artikeln diskuterar främst de tre typerna som listas nedan.
- Cells Iterator
- Rows Iterator
- Columns Iterator
Hur man använder Iteratorer
Cells Iterator
Det finns olika sätt att komma åt cellernas iterator, och man kan använda någon av dessa metoder baserat på applikationskraven. Här är metoderna som returnerar cellernas iterator.
- Cells.iterator
- Row.iterator
- Range.iterator
Alla ovan nämnda metoder returnerar en iterator som tillåter att traversera samlingen av celler som har initierats.
Följande kodexempel demonstrerar implementeringen av Iterator-klassen för en cellers samling.
// 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
Rows Iterator kan kommas åt när man använder RowCollection.iterator-metoden. Följande kodexempel demonstrerar implementeringen av Iteratorklassen för RowCollection-klassen.
// 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()); | |
} |
Columns Iterator
Columns Iterator kan kommas åt när man använder ColumnCollection.iterator-metoden. Följande kodexempel demonstrerar implementeringen av Iteratorklassen för ColumnCollection-klassen.
// 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()); | |
} |
Var man ska använda Iteratorer
För att diskutera fördelarna med att använda iteratorer, låt oss ta ett verkligt exempel.
Scenario
Ett applikationskrav är att traversera alla celler i en given arbetsbok för att läsa deras värden. Det kan finnas flera sätt att implementera detta mål. Några demonstreras nedan.
Användning av Display Range
// 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()); | |
} | |
} |
Användning av 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()); | |
} | |
} |
Som du kan se, använder båda ovan nämnda tillvägagångssätt mer eller mindre liknande logik, det vill säga; loopa över alla celler i samlingen för att läsa cellvärdena. Detta kan vara problematiskt av flera skäl som diskuteras nedan.
- API:er som MaxRow, MaxDataRow, MaxColumn, MaxDataColumn & MaxDisplayRange kräver extra tid för att samla in motsvarande statistik. Om datamatrisen (rader x kolumner) är stor kan användningen av dessa API:er innebära prestandastraff.
- I de flesta fall är inte alla celler i en given omfattning instansierade. I sådana situationer är det inte så effektivt att kontrollera varje cell i matrisen jämfört med att bara kontrollera de initierade cellerna.
- Åtkomst av en cell i en loop som Cells.get(rowIndex, columnIndex) kommer att orsaka att alla cellobjekt i en omfattning instansieras, vilket eventuellt kan orsaka OutOfMemoryError.
Slutsats
Baserat på ovan nämnda fakta, följande är de möjliga scenarier där iteratorer bör användas.
- Endast läsåtkomst av cellkollektionen krävs, det vill säga; kravet är att bara inspektera cellerna.
- Ett stort antal celler ska traverseras.
- Endast initialiserade celler/rader/kolumner ska traverseras.