Come e dove utilizzare gli iteratori
Un oggetto di un’interfaccia di iteratore può essere utilizzato per attraversare tutti gli elementi di una collezione. Gli iteratori possono essere utilizzati per ispezionare i dati in una collezione, ma non possono essere utilizzati per modificare la collezione sottostante. In generale, per utilizzare un iteratore per ciclare attraverso i contenuti di una collezione, devono essere seguiti i seguenti passaggi:
- Ottenere un iteratore all’inizio della collezione chiamando il metodo iteratore della collezione.
- Impostare un ciclo che effettua una chiamata al metodo hasNext. Fare in modo che il ciclo si ripeta finché il metodo hasNext restituisce true.
- All’interno del ciclo, ottenere ciascun elemento chiamando il metodo successivo.
Le API di Aspose.Cells forniscono un insieme di iteratori, tuttavia, questo articolo discute principalmente i tre tipi di seguito elencati.
- Iteratore celle
- Iteratore righe
- Iteratore colonne
Come utilizzare gli iteratori
Iteratore celle
Ci sono vari modi per accedere all’iteratore delle celle, e si può utilizzare uno qualsiasi di questi metodi in base alle esigenze dell’applicazione. Ecco i metodi che restituiscono l’iteratore delle celle.
- Cells.iterator
- Row.iterator
- Range.iterator
Tutti i metodi sopra menzionati restituiscono l’iteratore che consente di attraversare la collezione di celle che sono state inizializzate.
L’esempio di codice seguente dimostra l’implementazione della classe Iterator per una collezione di celle.
Iteratore delle righe
L’Iteratore delle righe può essere accessibile utilizzando il metodo RowCollection.iterator. L’esempio di codice seguente dimostra l’implementazione dell’Iterator per la classe RowCollection.
Iteratore delle colonne
L’Iteratore delle colonne può essere accessibile utilizzando il metodo ColumnCollection.iterator. L’esempio di codice seguente dimostra l’implementazione dell’Iteratore per la classe ColumnCollection.
Dove utilizzare gli iteratori
Per discutere i vantaggi dell’utilizzo degli iteratori, prendiamo un esempio in tempo reale.
Scenario
Un requisito dell’applicazione è attraversare tutte le celle in un dato Foglio di lavoro per leggere i loro valori. Potrebbero esserci diversi modi per implementare questo obiettivo. Ne vengono dimostrati alcuni di seguito.
Utilizzo della gamma di visualizzazione
Utilizzo di MaxDataRow e MaxDataColumn
Come puoi osservare, entrambi i suddetti approcci utilizzano più o meno la stessa logica, cioè; iterare su tutte le celle nella collezione per leggere i valori delle celle. Questo potrebbe essere problematico per diversi motivi come discusso di seguito.
- Le API come MaxRow, MaxDataRow, MaxColumn, MaxDataColumn e MaxDisplayRange richiedono tempo aggiuntivo per raccogliere le statistiche corrispondenti. Nel caso la matrice dei dati (righe x colonne) sia ampia, utilizzare queste API potrebbe infliggere una penalità sulle prestazioni.
- Nella maggior parte dei casi, non tutte le celle in un dato intervallo sono istanziate. In tali situazioni controllare ogni cella nella matrice non è così efficiente rispetto al controllo solo delle celle inizializzate.
- L’accesso a una cella in un ciclo come Cells.get(rowIndex, columnIndex) causerà l’istanziazione di tutti gli oggetti cella in un intervallo, il che potrebbe alla fine causare OutOfMemoryError.
Conclusioni
Sulla base dei fatti sopra menzionati, di seguito sono riportati i possibili scenari in cui dovrebbero essere utilizzati gli iteratori.
- È richiesto l’accesso in sola lettura della raccolta di celle, cioè; il requisito è solo ispezionare le celle.
- È necessario attraversare un grande numero di celle.
- Devono essere attraversate solo celle/righe/colonne inizializzate.