【问题标题】:Java - Reset iterator values in a loopJava - 在循环中重置迭代器值
【发布时间】:2014-09-17 20:44:28
【问题描述】:

所以我对 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);
}

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

【问题讨论】:

  • 只需创建一个新列表并用更改的对象填充它。迭代器不需要技巧。或者像 Paul Vargas 建议的那样使用 set 方法。

标签: java loops reference iteration


【解决方案1】:

你可以做下一个:

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

java.​util.​List 中方法 public E set(int index, E element)javadoc 声明:

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

【讨论】:

  • 你太棒了。但是,它将是for (int i = 0; i &lt; list.size(); i++) { list.set(i, change(list.get(i))) }
【解决方案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 上的索引访问元素的效率非常低。

【讨论】:

  • get(i)set(i) 是 O(1)。 ArrayList 的内部实现是一个数组。你在LinkedList 上是对的,但我使用的是ArrayList
  • 这就是重点。如果在 6 个月后您决定改用 LinkedList,则上述迭代仍将尽可能高效。这就是使用迭代器的全部意义所在。请注意,您并没有在问题的任何地方说您的列表是一个 ArrayList。
  • 好吧,从技术上讲,我确实说它是一个 ArrayList,但我明白你的意思。但是,就我而言,我永远不会将此列表设为 LinkedList。但是,总的来说,您的方式可能是最好的。
  • 吹毛求疵:从技术上讲,您要创建列表的 副本(可以是任何类型的列表),并且该副本是 ArrayList。跨度>
【解决方案3】:
for (Object obj : list) {
    obj = change(obj);
}

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

【讨论】:

  • 是的,我就是这么想的。
猜你喜欢
  • 2011-09-17
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多