Java - 在循环中重置迭代器值

时间:2014-07-25 22:01:39

标签: java loops reference iteration

所以我从来不知道Java迭代器/迭代/迭代是如何工作的,每隔一段时间我就会对如何做某事犹豫不决。这是其中一次。

我有一个对象列表,我需要更改每个对象。但由于我必须逐字重置列表中的每个引用,我不知道该怎么做。我想出了这个实现,它绝对肯定会起作用:

for (Object obj : new ArrayList<Object>(list)) {
    list.remove(obj);
    list.add(change(obj));
}

请注意,我不能这样做:

for (Object obj : list) { change(obj) }

因为obj的性质,我无法对其进行修改。 Change()返回一个已更改的新对象。

基本上,我问这是否可以:

for (Object obj : list) {
    obj = change(obj);
}

或者如果我必须使用顶级实现。

3 个答案:

答案 0 :(得分:3)

你可以做下一个:

for (int i = 0; i < list.size(); i++) {
    list.set(i, change(list.get(i)))
}

public E set(int index, E element)java.​util.​List个方法的 javadoc

  

使用指定的元素替换此列表中指定位置的元素(可选操作)。

答案 1 :(得分:2)

如果您想避免复制列表,最好的方法是使用ListIterator:

for (ListIterator<Object> it = list.listIterator(); it.hasNext(); ) {
    Object obj = it.next();
    it.set(change(obj));
}

使用get(i)set(i)的解决方案的优势在于,无论列表的类型如何,它都是O(n)。通过LinkedList上的索引访问元素是非常低效的。

答案 2 :(得分:0)

for (Object obj : list) {
    obj = change(obj);
}

不起作用,因为您只更改了局部变量引用,而不是列表中的引用。