CIAO! Nella lezione di oggi parleremo di Java Iterator. Immagina di andare in biblioteca e di voler trovare un libro in particolare. Come si fa? Se si tratta di saggistica, c'è il Dewey Decimal System. Se è finzione, sono ordinati in ordine alfabetico in base al cognome. Qualunque cosa tu stia cercando, a un certo punto, devi sfogliare i libri uno alla volta finché non trovi quello che stai cercando. Ogni volta che hai una raccolta di cose in Java, che sia memorizzata in un Array , un ArrayList , un Queue o un List , come trovi un valore particolare? Ad un certo punto, devi esaminare ogni elemento uno alla volta. Questo è lo scopo di un iteratore Java.
![Come utilizzare un iteratore Java: un breve tutorial - 1](https://cdn.codegym.cc/images/article/892e5196-b8b8-471b-a375-818b439b9d75/800.jpeg)
Che cos'è un iteratore in Java
Cos'è un iteratore in Java? È un modo di guardare ogni elemento di una collezione. E per raccolta intendiamo qualsiasi cosa nella classe Collection . Ciò comprende:- Lista di array
- Set di hash
- LinkedHashSet
- Lista collegata
- Coda prioritaria
- Vettore
- e molti altri…
Perché non dovresti usare i cicli For come iteratore in Java
Uno dei primi modi in cui a tutti viene insegnato a scorrere una raccolta in Java è per un ciclo. Sembra così:
class Main {
public static void main(String[] args) {
int exampleArray[] = new int[10];
//fill array with data
for(int x = 0; x < exampleArray.length; x++) {
System.out.println("Content of element " + x + "is: " + exampleArray[x]);
}
}
}
L'output sarebbe un elenco che recita:
Content of element 0 is: 0
Content of element 1 is: 1
Content of element 2 is: 2
etc.…
Questo ha i suoi usi, ma cosa succede se la raccolta non memorizza elementi in un sistema basato su indice? Ad esempio, gli insiemi non hanno ordine normalmente. Quindi è consigliabile uscire dalla pratica dell'uso di un ciclo for come iteratore in Java e fare pratica usando invece la classe Iterator<E> . Ecco alcuni esempi di iteratori java.
Come usare Iterator in Java
Ecco alcuni esempi di come utilizzare iteratore in Java. Quando si utilizza la classe iteratore, esistono tre modi per attraversare una raccolta. È possibile utilizzare un ciclo while() , un ciclo for() e un ciclo forEach() . Nota che questo ciclo for è diverso da quello di cui abbiamo parlato prima. Ecco i tre diversi esempi di iteratore java. Per prima cosa, impostiamo la Collection per l'iterazione.
import java.util.*; // imports ArrayList, Collection and Iterator
class Main {
public static void main(String[] args) {
Collection<String> example = new ArrayList<String>();
example.add("Item 1");
example.add("Item 2");
example.add("Item 3");
example.add("Item 4");
}
}
Questa è una semplice Collection composta da un ArrayList in cui abbiamo caricato quattro elementi. Ora diamo un'occhiata ai tre metodi di utilizzo della classe Iterator per attraversare ArrayList .
Ciclo while()
Iterator<String> iterator = example.iterator();
while (iterator.hasNext()) {
System.out.println("Element Value= " + iterator.next());
}
Questo ciclo while() utilizza il metodo booleano .hasNext() della classe Iterator per controllare se esiste un elemento futuro. Se la precondizione è vera, allora procede. Se restituisce false, il ciclo termina. La parte fondamentale qui è che i metodi .hasNext() e .next() eseguono entrambi un controllo iniziale del primo elemento. Se la Collection è vuota e non esiste un primo elemento, il metodo restituisce false per .hasNext() e genererà un'eccezione NoSuchElementException per il metodo .next() .
Per ciclo
for (Iterator<String> iterator = example.iterator(); iterator.hasNext();) {
System.out.println("Element Value= " + iterator.next());
}
Sembra un ciclo for più tradizionale. Utilizza il metodo .hasNext() come parte del controllo e della modifica delle condizioni. L'inizializzazione è la chiamata all'iteratore.
Per: ogni ciclo
for (String s : example) {
System.out.println("Element Value= " + s);
}
Il ciclo For:Each è un ciclo for, ma se non sai come leggerlo, potrebbe creare un po' di confusione. La sintassi di un ciclo For:Each è for (data_type variableName : collectionName){ body} . Questo per: ogni ciclo ha un paio di inconvenienti. Innanzitutto, può attraversare la raccolta solo in una direzione. In secondo luogo, devi scorrere ogni elemento. Non puoi saltare nessuno di loro. Ma come comodo iteratore di elenchi in Java, è l'opzione migliore. Tra i lati positivi, il ciclo for:each è molto facile da leggere e una volta che lo conosci, è difficile sbagliare. Se ti stai chiedendo quale sia l'output dei tre cicli iteratori, sono tutti uguali:
Element Value= Item 1
Element Value= Item 2
Element Value= Item 3
Element Value= Item 4
Come utilizzare un iteratore in Java per le mappe
Le mappe sono un modo comune per archiviare i dati, ma poiché non estendono Collection , non è possibile utilizzare gli iteratori precedenti per attraversare direttamente una mappa. Quindi, come si usa un iteratore in Java per passare attraverso Map s e HashMap s? Esistono quattro buoni metodi iteratori di mappe Java. Li copriremo singolarmente. Per prima cosa, carichiamo una mappa con una serie di valori.
import java.util.*; //imports Map and HashMap
class Main {
public static void main(String[] args) {
Map<String, String> example = new HashMap<String, String>();
example.put("alpha", "one");
example.put("beta", "two");
example.put("gamma", "three");
}
}
Metodo Java Hashmap Iterator: forEach(azione)
example.forEach((k,v) -> System.out.println("Key: "+ k + ", Value: " + v));
Questo metodo utilizza un'espressione lambda per l'iterazione. L'operatore lambda è il metodo forEach() e il corpo stampa i valori. Questo utilizza un operatore a più parametri. Questo è il metodo più veloce e pulito per l'iteratore di mappe in Java 8.
Metodo Java Hashmap Iterator: Ciclo For:Each()
for (Map.Entry<String, String> iterate : example.entrySet()) {
System.out.println("Key: " + iterate.getKey() + ", Value: " + iterate.getValue());
}
Questo utilizza la sintassi For:Each per chiamare il metodo entrySet() per restituire un set che ha la chiave e il valore come suoi elementi. Inoltre, quando si utilizza il metodo .Entry() , gli oggetti sono veri solo durante questa iterazione.
Metodo Java Hashmap Iterator: Map.Entry<k, v>
Iterator<Map.Entry<String, String>> iterator = example.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String, String> element = iterator.next();
System.out.println("Key: " + element.getKey() + ", Value: " + element.getValue());
)
Questo metodo converte nuovamente la mappa in un set per utilizzare Collections Iterator e metodi. Per questi tre metodi iteratori, il ritorno è simile al seguente:
Key: alpha, Value: one
Key: beta, Value: two
Key: gamma, Value: three
Java Hashmap Iterator Method: keySet() and values()
for (String key : example.keySet()) {
System.out.println("Key: " + key);
}
for (String value : example.values()) {
System.out.println("Value: " + value);
}
Questo restituisce gli elementi in modo diverso. Prima restituirà tutte le chiavi in ordine e poi tutti i valori:
Key: alpha
Key: beta
Key: gamma
Value: one
Value: two
Value: three
GO TO FULL VERSION