时间:2010-07-25 15:50:51

标签: java iterator

12 个答案:

答案 0 :(得分:91)

我有同样的问题,发现使用ListIterator工作。与上述测试类似:

List<String> list = Arrays.asList("zero", "one", "two");

ListIterator iter = list.listIterator();

while (iter.hasNext()) {
    System.out.println("index: " + iter.nextIndex() + " value: " + iter.next());
}

确保在实际获得next()之前调用nextIndex。

答案 1 :(得分:83)

答案 2 :(得分:27)

这是一种使用您自己的变量并保持简洁的方法:

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 - 只需在顶部执行)。

答案 3 :(得分:20)

您可以使用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);
}

答案 4 :(得分:10)

答案 5 :(得分:4)

答案 6 :(得分:2)

答案 7 :(得分:1)

请参阅here

iterator.nextIndex()将提供后续调用next()将返回的元素索引。

答案 8 :(得分:1)

做这样的事情:

        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.

        }

答案 9 :(得分:0)

您需要使用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 is index”然后它将打印迭代器找到它的索引。 :)

答案 10 :(得分:0)

尽管您已经有了答案,但还是想添加一些信息。

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

列出接口-ArrayList,LinkedList,Vector和Stack。

同时具有iterator()listIterator()

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

只有iterator()

地图界面-HashMap,LinkedHashMap,TreeMap和IdentityHashMap

没有迭代器,但是可以使用keySet()values()返回entrySet()并通过keySet() / entrySet()Set进行迭代。 values()返回Collection

因此最好使用iterators()并对其值进行连续递增以获取任何集合类型的当前索引。

答案 11 :(得分:0)

这是最简单的解决方案!

std :: vector v(5);

for(auto itr = v.begin(); itr!= v.end(); ++ itr){

auto current_loop_index = itr-v.begin();

std :: cout << current_loop_index << std :: endl;

}

在带有-std = c ++ 11标志的gcc-9上进行了测试

输出: 0 1个 2 3 4