Wie erhalte ich den aktuellen Schleifenindex bei Verwendung von Iterator?

Lesezeit: 4 Minuten

Benutzer-Avatar
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?

  • 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

Benutzer-Avatar
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

Benutzer-Avatar
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

Benutzer-Avatar
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

Benutzer-Avatar
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);
}

Benutzer-Avatar
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.

Benutzer-Avatar
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

1323090cookie-checkWie erhalte ich den aktuellen Schleifenindex bei Verwendung von Iterator?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy