所以我从来不知道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);
}
或者如果我必须使用顶级实现。
答案 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);
}
不起作用,因为您只更改了局部变量引用,而不是列表中的引用。