Używam Iteratora do iteracji w kolekcji i chcę uzyskać indeks bieżącego elementu.
Jak mogę to zrobić?
Używam Iteratora do iteracji w kolekcji i chcę uzyskać indeks bieżącego elementu.
Jak mogę to zrobić?
Odpowiedzi:
Użyj własnej zmiennej i zwiększ ją w pętli.
it.nextIndex()
. Przydatne, gdy kolekcja jest listą.
Miałem to samo pytanie i okazało się, że użycie ListIteratora działa. Podobnie jak w powyższym teście:
List<String> list = Arrays.asList("zero", "one", "two");
ListIterator iter = list.listIterator();
while (iter.hasNext()) {
System.out.println("index: " + iter.nextIndex() + " value: " + iter.next());
}
Upewnij się, że wywołujesz nextIndex ZANIM faktycznie otrzymasz next ().
Oto sposób, aby to zrobić, używając własnej zmiennej i zachowując zwięzłość:
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);
}
Wyjście (zgadłeś):
0: zero
1: one
2: two
Zaletą jest to, że nie zwiększasz indeksu w pętli (chociaż musisz uważać, aby wywoływać Iterator # next tylko raz na pętlę - po prostu zrób to na górze).
asList("zero", "one", "two")
Możesz użyć ListIterator
do liczenia:
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);
}
Jaki rodzaj kolekcji? Jeśli jest to implementacja interfejsu List, możesz po prostu użyć it.nextIndex() - 1
.
Użyj ListIterator, aby wykonać iterację w kolekcji. Jeśli kolekcja nie jest listą, należy Arrays.asList(Collection.toArray())
najpierw użyć, aby przekształcić ją w listę.
po prostu zrób coś takiego:
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.
}
Użyj wartości int i zwiększ ją w pętli.
Zobacz tutaj .
iterator.nextIndex()
podałby indeks elementu, który zostałby zwrócony przez kolejne wywołanie next()
.
Wszystko, czego potrzebujesz, aby użyć iterator.nextIndex (), aby zwrócić bieżący indeks, na którym znajduje się iterator. Może to być trochę łatwiejsze niż użycie własnej zmiennej licznika (która nadal działa).
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);
}
}
Ten kod przejdzie przez listę list1 po jednym elemencie na raz i wydrukuje tekst elementu, a następnie „jest w indeksie”, a następnie wydrukuje indeks, w którym iterator go znalazł. :)
Chociaż masz już odpowiedź, pomyślałem, aby dodać trochę informacji.
Jak wyraźnie wspomniałeś Kolekcje, nie możesz użyć listIterator
do pobrania indeksu dla wszystkich typów kolekcji.
Lista interfejsów - ArrayList, LinkedList, Vector i Stack.
Ma zarówno iterator()
ilistIterator()
Ustaw interfejsy - HashSet, LinkedHashSet, TreeSet i EnumSet.
Ma jedynie iterator()
Interfejsy map - HashMap, LinkedHashMap, TreeMap i IdentityHashMap
Nie ma iteratorów, ale można je iterować za pomocą keySet()
/ values()
lubentrySet()
as keySet()
oraz entrySet()
zwraca Set
i values()
zwracaCollection
.
Dlatego lepiej jest używać iterators()
z ciągłym zwiększaniem wartości, aby uzyskać bieżący indeks dla dowolnego typu kolekcji.