2010-07-25 28 views
76

我正在使用迭代器遍历集合 ,我想获取当前元素的索引。如何在使用迭代器时获取当前循环索引?

我该怎么做?

+0

可能重复[是否有访问Java的for-each循环迭代柜台的方式?(http://stackoverflow.com/questions/477550/is-there-a-way-to-access-an-iteration-counter-in-javas-for-each-loop) – finnw 2010-07-25 16:10:34

+1

@finnw我不认为它们是重复的。这个问题是使用Iterator,另一个是使用for-each循环。这两个问题都是通过类似的方法解决的,所以答案是重复的而不是问题。 – Robert 2014-06-03 11:03:31

回答

70

使用自己的变量,在环加一。

+4

但是请参阅@ mateusz-dymczyk有关'it.nextIndex()'的建议。收集是List时有用。 – noamtm 2016-09-06 08:57:49

2

使用int和你的循环中增加它。

9

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

4

使用ListIterator通过收集迭代。如果集合不是以使用Arrays.asList(Collection.toArray())首先将其变成列表开始的列表开始。

0

here

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

+0

接口迭代器没有nextIndex()方法。你需要为此明确使用一个ListIterator,但是OP对Iterator有特别的质疑。 – 2018-02-21 11:10:26

21

这里是一种使用自己的变量,并保持其简洁的做到这一点:

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

+2

如果你自己创建迭代器,你也可以使用ListIterator,并且不需要单独的int变量。 – 2012-08-20 07:14:14

+1

如果你为Arrays.asList使用'静态导入',那么你可以直接写'asList(“zero”,“one”,“two”)' – karmakaze 2015-06-23 15:48:30

+0

,这正是我在阅读Paul的答案之前所做的。我强烈劝阻你,因为我没有看到任何好处。你认为有一个优点(除了提到的那个)。你为什么不使用for-each循环?如果使用自己的变量,则明确定义迭代器不是必需的。 – 2016-05-20 08:08:35

75

我有同样的问题,使用的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之前,你实际上得到下一个()。

+1

感谢您提及'确保您调用nextIndex之前,您实际上得到下一个()' – 2016-12-22 11:27:51

19

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

此代码将通过列表1列表一个项目的时间和打印项目的文本,然后在“在索引”,那么它将打印索引迭代器发现它的。 :)

+1

实际上,您的代码已关闭,因为它试图显示索引后调用it.next()。 – Henrik 2014-01-23 11:17:36

+1

你是对的,谢谢!非常迟到的回复我的部分大声笑。 – Ryan 2015-04-06 14:19:52

-3

只是做这样的事情:

for (AbstractDevice device : mDevicesList){ 
int curIndex = mDevicesList.indexOf(device)); 

      } 
+4

调用indexOf()将需要额外扫描设备列表。简单地增加一个本地计数器会更快。 – 2014-03-13 13:24:34

相关问题