Java-在循环中重置迭代器值
所以我对Java迭代器/iterables/iterations是如何工作的从来都不太了解,而且每隔一段时间我都会对如何做某事犹豫不决。这是其中一次 我有一个对象列表,我需要更改每个对象。但是,由于我必须重新设置列表中的每个引用,我不知道该怎么做。我提出了这一实施方案,这将确保它绝对有效:Java-在循环中重置迭代器值,java,loops,reference,iteration,Java,Loops,Reference,Iteration,所以我对Java迭代器/iterables/iterations是如何工作的从来都不太了解,而且每隔一段时间我都会对如何做某事犹豫不决。这是其中一次 我有一个对象列表,我需要更改每个对象。但是,由于我必须重新设置列表中的每个引用,我不知道该怎么做。我提出了这一实施方案,这将确保它绝对有效: for (Object obj : new ArrayList<Object>(list)) { list.remove(obj); list.add(change(obj));
for (Object obj : new ArrayList<Object>(list)) {
list.remove(obj);
list.add(change(obj));
}
由于obj
的性质,我无法对其进行适当的修改Change()
返回已更改的新对象
基本上,我是问这是否可以:
for (Object obj : list) {
obj = change(obj);
}
或者如果我必须使用top实现。您可以执行下一步:
for (int i = 0; i < list.size(); i++) {
list.set(i, change(list.get(i)))
}
for(int i=0;i
方法的javadoc状态为:
用指定的元素替换此列表中指定位置的元素(可选操作)
您可以执行以下操作:
for (int i = 0; i < list.size(); i++) {
list.set(i, change(list.get(i)))
}
for(int i=0;i
方法的javadoc状态为:
用指定的元素替换此列表中指定位置的元素(可选操作)
将不起作用,因为您只更改局部变量引用,而不是列表中的引用
将不起作用,因为您只更改局部变量引用,而不是列表中的引用。如果要避免复制列表,最好使用ListIterator:
for (ListIterator<Object> it = list.listIterator(); it.hasNext(); ) {
Object obj = it.next();
it.set(change(obj));
}
for(ListIterator it=list.ListIterator();it.hasNext();){
Object obj=it.next();
it.set(变更(obj));
}
与使用
get(i)
和set(i)
的解决方案相比,该解决方案的优势在于无论列表的类型如何,它都是O(n)。在LinkedList上通过索引访问元素的效率非常低。如果要避免复制列表,最好的方法是使用ListIterator:
for (ListIterator<Object> it = list.listIterator(); it.hasNext(); ) {
Object obj = it.next();
it.set(change(obj));
}
for(ListIterator it=list.ListIterator();it.hasNext();){
Object obj=it.next();
it.set(变更(obj));
}
与使用
get(i)
和set(i)
的解决方案相比,该解决方案的优势在于无论列表的类型如何,它都是O(n)。在LinkedList上通过索引访问元素的效率非常低。只需创建一个新列表并用更改的对象填充即可。不需要使用迭代器的技巧。或者像Paul Vargas建议的那样使用set方法。只需创建一个新列表并用更改的对象填充它。不需要使用迭代器的技巧。或者像Paul Vargas建议的那样使用set方法。你太棒了。然而,对于(inti=0;iget(i)
和set(i)
都是O(1)。ArrayList的内部实现是一个数组。你的链接列表是正确的,但我使用的是ArrayList
。这就是重点。如果在6个月后你决定使用LinkedList,那么上面的迭代仍然会尽可能的高效。这就是使用迭代器的全部意义。请注意,在你的问题中,你并没有说你的列表是一个ArrayList。从技术上讲,我确实说它是一个ArrayList,但我明白你的意思。然而,就我而言,我永远不会让这个列表成为LinkedList。不过,一般来说,你的方式可能是最好的。挑剔:从技术上讲,你说的是你创建了一个列表的副本(可以是任何类型的列表),并且这个副本是一个数组列表。get(i)
和set(i)
都是O(1)。ArrayList的内部实现是一个数组。你的链接列表是正确的,但我使用的是ArrayList
。这就是重点。如果在6个月后你决定使用LinkedList,那么上面的迭代仍然会尽可能的高效。这就是使用迭代器的全部意义。请注意,在你的问题中,你并没有说你的列表是一个ArrayList。从技术上讲,我确实说它是一个ArrayList,但我明白你的意思。然而,就我而言,我永远不会让这个列表成为LinkedList。不过,一般来说,你的方式可能是最好的。挑剔:从技术上讲,你说的是你创建了一个列表的副本(可以是任何类型的列表),而这个副本是一个ArrayList。