有没有办法获取列表的元素ID,以便稍后通过list.get(index)
使用时
for(Object obj: o)
构造
只定义一个局部变量并手动递增它? 有什么更简单的吗?
答案 0 :(得分:8)
不,for-each
循环不跟踪索引。您可以使用常规索引循环,也可以执行以下操作:
int idx = 0;
for (Object o : list) {
...
idx++;
}
这是有风险的,因为break
/ continue
会使idx
失去同步,所以请不要频繁使用,只有当正文很简单并且只有几行长时才使用。
如果元素不同,List.indexOf
也会有效,尽管在O(N)
,此时您可能需要考虑Set
(无序,但保证不同)。< / p>
还应该说,有时使用listIterator()
也可以减少迭代时显式索引的需要。
ListIterator
支持add
,set
和remove
次操作。
就迭代机制而言,这是List
对数组的另一个明显优势。
答案 1 :(得分:5)
简单的答案是否。
我能想到的最好的方法是将迭代和索引结合起来如下:
int idx = 0;
for (Iterator<Object> it = list.iterator(); it.hasNext(); idx++) {
Object o = it.next();
// ...
}
此方法的优势在于break
和continue
不会弄乱idx
计算。
另一方面,如果list
是ArrayList
并且您想要跟踪索引,那么您最好只使用
for (idx = 0; idx < list.size(); idx++) {
Object o = list.get(idx);
// ...
}
答案 2 :(得分:2)
这个问题措辞不是很好,但是我可以告诉你,你希望在Object
中找到特定List<Object>
的位置,然后通过该索引检索它? / p>
首先,如果你知道你正在寻找的Object
那么你就不需要在List
中找到它,因为你已经拥有它了。
那就是说,你可以轻易做到这样的事情:
int index = -1;
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals(myObject)) {
index = i;
break;
}
}
但是,我会再次查看您的应用程序,以确定这是否真的是您需要做的事情。
答案 3 :(得分:2)
您需要使用:
list.indexOf(o);
文档为here
@Eugene我看到你在评论中提到你计划存储对象索引的另一个答案(在有问题的对象中?),这可能不是一个好主意,因为对象索引要非常小心可以改变。