0

在练习中,我们必须在循环中用另一个对象替换一个对象。我的解决方案是使用“ListIterator”。但是一位同事尝试使用 foreach 语法并播放参考,但此解决方案不起作用。

// This doesn't work
for ( Growable growable : growables ) {
  growable = growable.grow(); // Return another object (seed -> sprout, ..)
}

// But that well
for (final ListIterator<Growable> it = growables.listIterator(); it.hasNext();) {
  it.set(it.next().grow());
}

从文档 [1] 中,我可以读到 foreach 不适合替换,因为我们没有对迭代器的引用。

程序需要访问迭代器才能删除当前元素。for-each 循环隐藏了迭代器,因此您不能调用 remove。因此,for-each 循环不可用于过滤。同样,它不适用于在遍历时需要替换列表或数组中的元素的循环。

但是我们有一个对迭代对象的引用。我错了吗 ?有人可以解释一下为什么“foreach”解决方案不起作用吗?

谢谢

[1] http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html

4

2 回答 2

0

在 foreach 的情况下,growable 只是被分配了一个值,这将在下一步中被遗忘,因为新的迭代将会发生并且growable 的值将被growables 中的下一个元素覆盖

于 2013-07-25T10:18:28.083 回答
0

在您的第一个片段中,您从 中获取一个元素growables并将其分配给growable. 这意味着变量growable 引用了该元素。

如果您重新分配growable,它将开始引用另一个对象。但这不会改变对象从growables.


要了解发生了什么,您可以将其与数组进行比较。使用 foreach 语法:

int[] array = {1, 2, 3};
for (int x : array) {
    x = 0;
}
System.out.println(array[0]);

这将打印1. 原因是这个片段相当于

int[] array = {1, 2, 3};
for (int i = 0; i < array.length; i++) {
    int x = array[i];
    x = 0;
}
System.out.println(array[0]);

现在更明显的是,赋值x不会修改array.

于 2013-07-25T10:16:49.090 回答