【发布时间】:2011-03-20 18:43:22
【问题描述】:
我正在使用一个迭代器来遍历一个集合 我想获取当前元素的索引。
我该怎么做?
【问题讨论】:
-
@finnw 我不认为它们是重复的。这个问题是使用迭代器问的,另一个是使用 for-each 循环。这两个问题都是通过类似的方法解决的,所以答案是重复的,而不是问题。
我正在使用一个迭代器来遍历一个集合 我想获取当前元素的索引。
我该怎么做?
【问题讨论】:
我有同样的问题,发现使用ListIterator 有效。和上面的测试类似:
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());
}
确保在您真正得到next()之前在之前调用nextIndex()。
【讨论】:
使用您自己的变量并在循环中递增。
【讨论】:
it.nextIndex() 的建议。当集合是列表时很有用。
这是一种使用您自己的变量并保持简洁的方法:
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 一次 - 只需在顶部执行)。
【讨论】:
asList("zero", "one", "two")
您可以使用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);
}
【讨论】:
什么样的收藏?如果它是 List 接口的实现,那么您可以使用 it.nextIndex() - 1。
【讨论】:
使用 int 并在循环中递增它。
【讨论】:
只需这样做:
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 遍历集合。如果 Collection 不是 List 开头,请先使用Arrays.asList(Collection.toArray()) 将其转换为 List。
【讨论】:
您只需要使用 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 列表并打印该项目的文本,然后“位于索引处”,然后它将打印迭代器找到它的索引。 :)
【讨论】:
见here。
iterator.nextIndex() 将提供元素的索引,随后调用next() 将返回该索引。
【讨论】:
虽然你已经有了答案,但还是想补充一些信息。
正如您明确提到的集合,您不能使用listIterator 来获取所有类型集合的索引。
列表接口 - ArrayList、LinkedList、Vector 和 Stack。
同时拥有iterator() 和listIterator()
设置接口 - HashSet、LinkedHashSet、TreeSet 和 EnumSet。
只有iterator()
Map 接口 - HashMap、LinkedHashMap、TreeMap 和 IdentityHashMap
没有迭代器,但可以通过keySet() / values() 或entrySet() 进行迭代,因为keySet() 和entrySet() 返回Set 和values() 返回Collection。
所以最好使用iterators() 连续增加一个值来获取任何集合类型的当前索引。
【讨论】:
这将是最简单的解决方案!
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 标志在 gcc-9 上测试
输出:
0
1
2
3
4
【讨论】: