Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-在循环中重置迭代器值_Java_Loops_Reference_Iteration - Fatal编程技术网

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

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));

所以我对Java迭代器/iterables/iterations是如何工作的从来都不太了解,而且每隔一段时间我都会对如何做某事犹豫不决。这是其中一次

我有一个对象列表,我需要更改每个对象。但是,由于我必须重新设置列表中的每个引用,我不知道该怎么做。我提出了这一实施方案,这将确保它绝对有效:

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;i你太棒了。然而,对于(inti=0;i是的,这就是我的想法。是的,这就是我的想法。
get(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。