Sto usando un iteratore per iterare in una raccolta e voglio ottenere l'indice dell'elemento corrente.
Come lo posso fare?
Sto usando un iteratore per iterare in una raccolta e voglio ottenere l'indice dell'elemento corrente.
Come lo posso fare?
Risposte:
Usa la tua variabile e incrementala nel ciclo.
it.nextIndex()
. Utile quando la raccolta è una lista.
Ho avuto la stessa domanda e ho scoperto che l'utilizzo di un ListIterator ha funzionato. Simile al test sopra:
List<String> list = Arrays.asList("zero", "one", "two");
ListIterator iter = list.listIterator();
while (iter.hasNext()) {
System.out.println("index: " + iter.nextIndex() + " value: " + iter.next());
}
Assicurati di chiamare nextIndex PRIMA di ottenere effettivamente next ().
Ecco un modo per farlo usando la tua variabile e mantenendola concisa:
List<String> list = Arrays.asList("zero", "one", "two");
int i = 0;
for (Iterator<String> it = list.iterator(); it.hasNext(); i++) {
String s = it.next();
System.out.println(i + ": " + s);
}
Uscita (hai indovinato):
0: zero
1: one
2: two
Il vantaggio è che non aumenti il tuo indice all'interno del ciclo (anche se devi stare attento a chiamare Iterator # next una sola volta per ciclo - fallo semplicemente in alto).
asList("zero", "one", "two")
Puoi usare ListIterator
per fare il conteggio:
final List<String> list = Arrays.asList("zero", "one", "two", "three");
for (final ListIterator<String> it = list.listIterator(); it.hasNext();) {
final String s = it.next();
System.out.println(it.previousIndex() + ": " + s);
}
Che tipo di raccolta? Se è un'implementazione dell'interfaccia List, puoi semplicemente usare it.nextIndex() - 1
.
Usa un ListIterator per scorrere la raccolta. Se la raccolta non è una lista per iniziare, usa prima Arrays.asList(Collection.toArray())
di trasformarla in una lista.
basta fare qualcosa del genere:
ListIterator<String> it = list1.listIterator();
int index = -1;
while (it.hasNext()) {
index++;
String value = it.next();
//At this point the index can be checked for the current element.
}
Usa un int e incrementalo all'interno del tuo ciclo.
Vedi qui .
iterator.nextIndex()
fornirebbe l'indice dell'elemento che sarebbe restituito dalla successiva chiamata a next()
.
Tutto ciò che serve per usarlo è iterator.nextIndex () per restituire l'indice corrente su cui si trova l'iteratore. Questo potrebbe essere un po 'più semplice che usare la tua variabile contatore (che funziona ancora).
public static void main(String[] args) {
String[] str1 = {"list item 1", "list item 2", "list item 3", "list item 4"};
List<String> list1 = new ArrayList<String>(Arrays.asList(str1));
ListIterator<String> it = list1.listIterator();
int x = 0;
//The iterator.nextIndex() will return the index for you.
while(it.hasNext()){
int i = it.nextIndex();
System.out.println(it.next() + " is at index" + i);
}
}
Questo codice scorrerà l'elenco list1 un elemento alla volta e stamperà il testo dell'elemento, quindi "is at index" quindi stamperà l'indice in cui l'iteratore lo ha trovato. :)
Sebbene avessi già la risposta, ho pensato di aggiungere alcune informazioni.
Come hai menzionato esplicitamente le raccolte, non puoi utilizzare listIterator
per ottenere l'indice per tutti i tipi di raccolte.
Interfacce elenco : ArrayList, LinkedList, Vector e Stack.
Ha sia iterator()
elistIterator()
Set interfaces - HashSet, LinkedHashSet, TreeSet e EnumSet.
Ha solo iterator()
Interfacce mappa : HashMap, LinkedHashMap, TreeMap e IdentityHashMap
Non ha iteratori, ma può essere iterato usando keySet()
/ values()
o entrySet()
come keySet()
eentrySet()
restituisce Set
e values()
restituisceCollection
.
Quindi è meglio usare iterators()
con incremento continuo di un valore per ottenere l'indice corrente per qualsiasi tipo di raccolta.