代码之家  ›  专栏  ›  技术社区  ›  Mahmoud Saleh

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

  •  84
  • Mahmoud Saleh  · 技术社区  · 14 年前

    我使用迭代器对集合进行迭代 我想得到当前元素的索引。

    我该怎么做?

    11 回复  |  直到 8 年前
        1
  •  99
  •   om-nom-nom    11 年前

        2
  •  125
  •   BuZZ-dEE Brian Goetz    4 年前

    我也有同样的问题,发现使用 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());
    }
    

    一定要打电话给警察 nextIndex() 你真的得到了 next()

        3
  •  29
  •   Tom Clift    12 年前

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

    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,只需在顶部调用即可)。

        4
  •  23
  •   Mihir Trivedi    7 年前

    你可以用 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);
    }
    
        5
  •  12
  •   Willi Mentzel user670265    8 年前

    it.nextIndex() - 1 .

        6
  •  4
  •   Carl Smotricz    14 年前

        7
  •  3
  •   Sunny    6 年前

    就这样做吧:

            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.
    
            }
    
        8
  •  3
  •   BuZZ-dEE Brian Goetz    4 年前

    ListIterator 遍历集合。如果集合不是一个列表,则使用 Arrays.asList(Collection.toArray())

        9
  •  1
  •   Willi Mentzel user670265    8 年前

    看到了吗 here .

    iterator.nextIndex() next() .

        10
  •  0
  •   Ryan    9 年前

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

        11
  •  0
  •   Vignesh Raja    6 年前

    虽然你已经有了答案,但我想补充一些信息。

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

    两者都有 iterator() listIterator()

    设置接口

    只有 迭代器()

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

    keySet() / values() entrySet() 作为 密钥集() 入口集() 退货 Set 值() 退货 Collection .

    所以最好用 iterators() 以获取任何集合类型的当前索引。

        12
  •  0
  •   Brian Tompsett - 汤莱恩 andrewwong97    4 年前

    这将是最简单的解决方案!

    std::vector<double> 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 旗帜

    0
    1


    4