for(Object object:list)[java]和index元素

时间:2010-05-18 14:21:28

标签: java list loops

有没有办法获取列表的元素ID,以便稍后通过list.get(index)

获取它

使用时

for(Object obj: o)

构造

只定义一个局部变量并手动递增它? 有什么更简单的吗?

4 个答案:

答案 0 :(得分:8)

不,for-each循环不跟踪索引。您可以使用常规索引循环,也可以执行以下操作:

int idx = 0;
for (Object o : list) {
   ...
   idx++;
}

这是有风险的,因为break / continue会使idx失去同步,所以请不要频繁使用,只有当正文很简单并且只有几行长时才使用。

如果元素不同,List.indexOf也会有效,尽管在O(N),此时您可能需要考虑Set(无序,但保证不同)。< / p>


还应该说,有时使用listIterator()也可以减少迭代时显式索引的需要。

ListIterator支持addsetremove次操作。

就迭代机制而言,这是List对数组的另一个明显优势。

答案 1 :(得分:5)

简单的答案是否。

我能想到的最好的方法是将迭代和索引结合起来如下:

int idx = 0;
for (Iterator<Object> it = list.iterator(); it.hasNext(); idx++) {
    Object o = it.next();
    // ...
}

此方法的优势在于breakcontinue不会弄乱idx计算。

另一方面,如果listArrayList并且您想要跟踪索引,那么您最好只使用

的变体
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我看到你在评论中提到你计划存储对象索引的另一个答案(在有问题的对象中?),这可能不是一个好主意,因为对象索引要非常小心可以改变。