Ich verwende einen Iterator, um eine Sammlung zu durchlaufen, und möchte den Index des aktuellen Elements abrufen.
Wie kann ich das machen?
Ich verwende einen Iterator, um eine Sammlung zu durchlaufen, und möchte den Index des aktuellen Elements abrufen.
Wie kann ich das machen?
Antworten:
Verwenden Sie Ihre eigene Variable und erhöhen Sie sie in der Schleife.
it.nextIndex()
. Nützlich, wenn die Sammlung eine Liste ist.
Ich hatte die gleiche Frage und fand mit einem ListIterator funktioniert. Ähnlich wie beim obigen Test:
List<String> list = Arrays.asList("zero", "one", "two");
ListIterator iter = list.listIterator();
while (iter.hasNext()) {
System.out.println("index: " + iter.nextIndex() + " value: " + iter.next());
}
Stellen Sie sicher, dass Sie den nextIndex aufrufen, bevor Sie den next () erhalten.
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 # nur einmal pro Schleife aufzurufen - tun Sie dies einfach oben).
asList("zero", "one", "two")
Sie können verwenden ListIterator
, um zu 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);
}
Was für eine Sammlung? Wenn es sich um eine Implementierung der List-Schnittstelle handelt, können Sie diese einfach verwenden it.nextIndex() - 1
.
Verwenden Sie einen ListIterator , um die Sammlung zu durchlaufen. Wenn es sich bei der Sammlung zunächst nicht um eine Liste handelt, wird Arrays.asList(Collection.toArray())
sie zunächst in eine Liste umgewandelt.
mach einfach so etwas:
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.
}
Verwenden Sie ein int und erhöhen Sie es innerhalb Ihrer Schleife.
Siehe hier .
iterator.nextIndex()
würde einen Index des Elements bereitstellen, das durch einen nachfolgenden Aufruf von zurückgegeben würde next()
.
Alles, was Sie brauchen, ist iterator.nextIndex (), um den aktuellen Index zurückzugeben, auf dem sich der Iterator befindet. Dies könnte etwas einfacher sein als die Verwendung einer eigenen Zählervariablen (die auch noch funktioniert).
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);
}
}
Dieser Code durchläuft die Liste1 einzeln und druckt den Text des Elements. Dann wird "ist am Index" und dann der Index gedruckt, bei dem der Iterator ihn gefunden hat. :) :)
Obwohl Sie bereits die Antwort hatten, dachten Sie daran, einige Informationen hinzuzufügen.
Wie Sie bereits erwähnt haben, können Sie listIterator
den Index nicht für alle Arten von Sammlungen abrufen.
Liste Schnittstellen - Arraylist, LinkedList, Vektor und Stapel.
Hat beide iterator()
undlistIterator()
Festlegen von Schnittstellen - HashSet, LinkedHashSet, TreeSet und EnumSet.
Hat nur iterator()
Karte Schnittstellen - HashMap, LinkedHashMap, TreeMap und IdentityHashMap
Hat keine Iteratoren, kann aber mit keySet()
/ values()
oder entrySet()
as keySet()
und entrySet()
return Set
und values()
return iteriert werden Collection
.
Daher ist es besser, iterators()
mit einem kontinuierlichen Inkrement eines Werts den aktuellen Index für jeden Sammlungstyp abzurufen.