使用迭代器时如何获得当前循环索引?

我使用迭代器来迭代一个集合 我想得到当前元素的索引。

我该怎么做?

205552 次浏览

在循环中使用 int 并增加它。

使用您自己的变量并在循环中增加它。

什么样的集合? 如果它是 List 接口的实现,那么您可以使用 it.nextIndex() - 1

使用 ListIterator循环访问集合。如果集合不是一个列表,首先使用 Arrays.asList(Collection.toArray())将其转换为一个列表。

参见 给你

iterator.nextIndex()将提供元素的索引,这些元素将通过随后对 next()的调用返回。

这里有一个使用你自己的变量并保持简洁的方法:

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

输出(你猜对了) :

0: zero
1: one
2: two

这样做的好处是不需要在循环中增加索引(尽管在每个循环中只需要调用 Iterator # next 一次——只需要在顶部调用)。

I had the same question and found using a ListIterator worked. Similar to the test above:

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());
}

确保你调用的 nextIndex() 之前你实际上得到的 next()

你可以使用 ListIterator来计算:

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

您只需使用 iterator.nextIndex ()返回迭代器所在的当前索引。这可能比使用您自己的计数器变量(它仍然可以工作)要容易一些。

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

这段代码将一次遍历 list1列表中的一个项目并打印该项目的文本,然后“ is at index”,然后它将打印迭代器找到的索引。:)

就像这样做:

        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.


}

虽然你已经知道答案了,但还是想补充一些信息。

正如您明确提到的集合,您不能使用 listIterator来获取所有类型集合的索引。

列表接口 -ArrayList、 LinkedList、 Vector 和 Stack。

Has both iterator() and listIterator()

设置接口 -HashSet、 LinkedHashSet、 TreeSet 和 EnumSet。

只有 iterator()

映射接口 -HashMap、 LinkedHashMap、 TreeMap 和 IdentityHashMap

Has no iterators, but can be iterated using through the keySet() / values() or entrySet() as keySet() and entrySet() returns Set and values() returns Collection.

因此,最好使用 iterators()连续递增一个值来获得任何集合类型的当前索引。