答案 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