Hur och var man ska använda iteratorer

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.

  1. Cells.iterator
  2. Row.iterator
  3. 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.

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.

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.

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
Användning av MaxDataRow & MaxDataColumn

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.

  1. 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.
  2. 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.
  3. Å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.

  1. Endast läsåtkomst av cellkollektionen krävs, det vill säga; kravet är att bara inspektera cellerna.
  2. Ett stort antal celler ska traverseras.
  3. Endast initialiserade celler/rader/kolumner ska traverseras.