Ich verwende einen Iterator, um eine Sammlung zu durchlaufen, und ich möchte den Index des aktuellen Elements abrufen.
Wie kann ich das machen?
Mahmud Saleh
Ich verwende einen Iterator, um eine Sammlung zu durchlaufen, und ich möchte den Index des aktuellen Elements abrufen.
Wie kann ich das machen?
Paul
Ich hatte die gleiche Frage und fand mit a ListIterator
hat funktioniert. Ähnlich wie beim obigen Test:
List<String> list = Arrays.asList("zero", "one", "two");
ListIterator<String> iter = list.listIterator();
while (iter.hasNext()) {
System.out.println("index: " + iter.nextIndex() + " value: " + iter.next());
}
Rufen Sie unbedingt an nextIndex()
Vor du bekommst die eigentlich next()
.
Vielen Dank für die Erwähnung von „Stellen Sie sicher, dass Sie den nextIndex aufrufen, BEVOR Sie tatsächlich den next() erhalten.“
– Kumpelbär
22. Dezember 2016 um 11:27 Uhr
Danke, das war mir vorher nicht bekannt. Die Warnung, die ich machen möchte, ist, dass ListIterator bidirektional ist, während Iterator unidirektional ist. Solange Sie es vermeiden, sich mit einem Cursor hin und her zu bewegen, sollten Sie auf der sicheren Seite sein.
– Benutzer2910265
10. Januar 2020 um 0:35 Uhr
Chris Taucher
Verwenden Sie Ihre eigene Variable und erhöhen Sie sie in der Schleife.
Aber siehe auch @mateusz-dymczyk Vorschlag über it.nextIndex()
. Nützlich, wenn die Sammlung eine Liste ist.
– noamtm
6. September 2016 um 8:57 Uhr
Tom Clift
Hier ist eine Möglichkeit, dies mit Ihrer eigenen Variablen zu tun und sie kurz zu halten:
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);
}
Ausgabe (Sie haben es erraten):
0: zero
1: one
2: two
Der Vorteil ist, dass Sie Ihren Index nicht innerhalb der Schleife erhöhen (obwohl Sie darauf achten müssen, Iterator#next nur einmal pro Schleife aufzurufen – tun Sie es einfach oben).
Wenn Sie den Iterator selbst erstellen, können Sie auch einen ListIterator verwenden und benötigen keine separate int-Variable.
– Robert Klemme
20. August 2012 um 7:14 Uhr
Wenn Sie einen ‘statischen Import’ für Arrays.asList verwenden, können Sie einfach schreiben asList("zero", "one", "two")
– Karmakaze
23. Juni 2015 um 15:48 Uhr
genau so habe ich es gemacht, bevor ich die Antwort von Paul gelesen habe. Ich würde dir dringend von deinem Weg abraten, da ich darin keinen Vorteil sehe. Glaubst du, es gibt einen Vorteil (außer dem genannten). Warum hast du keine For-Each-Schleife verwendet? Die explizite Definition des Iterators ist nicht notwendig, wenn Sie eine eigene Variable verwenden.
– Willi Mentzel
20. Mai 2016 um 8:08 Uhr
@progressive_overload nur, wenn Sie einen Iterator benötigen (wie pro Frage, zB zur Übergabe an die Bibliothek), den das Beispiel nicht zeigt. In diesem Beispiel haben Sie eine Variable außerhalb der Schleife und müssen darauf achten, #next einmal aufzurufen. In Pauls Beispiel gibt es keine Variablen außerhalb der Schleife, aber Sie müssen darauf achten, #next und #nextIndex einmal zusammen aufzurufen (und in der Praxis würden sie, wenn sie mehr als einmal verwendet werden, in lokale Variablen gezogen, was in diesem Beispiel nicht der Fall ist nicht zeigen).
– Tom Clift
28. Mai 2016 um 5:05 Uhr
Robert Klemme
Sie können verwenden ListIterator
zum Zählen:
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);
}
Mateusz Dymczyk
Was für eine Sammlung? Wenn es sich um eine Implementierung der List-Schnittstelle handelt, können Sie einfach verwenden it.nextIndex() - 1
.
Karl Smotricz
Verwenden Sie ein int und erhöhen Sie es innerhalb Ihrer Schleife.
mach einfach sowas:
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.
}
Der Aufruf von indexOf() erfordert einen zusätzlichen Scan der Geräteliste. Es wird schneller sein, einfach einen lokalen Zähler zu inkrementieren.
– Gregor Brown
13. März 2014 um 13:24 Uhr
einverstanden. Dies ist nicht die effizienteste Lösung.
– Sonnig
23. Juli 2018 um 5:59 Uhr
Sieht so aus, als hätten Sie das Beispiel aktualisiert, um effizienter zu sein.
– Gregor Brown
23. Juli 2018 um 13:11 Uhr
mögliches Duplikat von Gibt es eine Möglichkeit, auf einen Iterationszähler in Javas for-each-Schleife zuzugreifen?
– finnw
25. Juli 2010 um 16:10 Uhr
@finnw Ich glaube nicht, dass sie doppelt sind. Diese Frage wird mit Iterator gestellt, die andere mit For-Each-Schleife. Beide Fragen werden durch einen ähnlichen Ansatz gelöst, sodass die Antworten doppelt sind, nicht die Frage.
– Robert
3. Juni 2014 um 11:03 Uhr