【问题标题】:Why cant I add to ListIterator while iterating over it?为什么我不能在迭代列表迭代器时添加它?
【发布时间】:2019-10-16 08:57:01
【问题描述】:

我试图在迭代 ListIterator 时添加它,但在检查它是否工作时 hasNext() 总是返回 false。

正如javadoc 所说,ListIterator 是“一个列表迭代器,允许程序员在任一方向遍历列表,在迭代期间修改列表,并且获取迭代器在列表中的当前位置。”但是,当我尝试添加时,我既没有收到错误消息,也没有 ListIterator 获得新元素。

public void foo() {
    List<String> bar = new ArrayList<String>();
    bar.add("foobar");
    ListIterator<String> quux = bar.listIterator();
    while(quux.hasNext()) {
        if(quux.next().equals("foobar")) {
            quux.add("baz");
        }
    }
}

在这个函数结束时,我希望 ListIterator 包含新的字符串“baz”。但是,当我调用 hasNext() 方法时,它返回 false。程序甚至通过了 if 语句,结果表明 add-method 没有做它应该做的事情。

【问题讨论】:

  • 我绝对喜欢那些不加解释就对 Q/A 投反对票的人。继续这样,这太有用了。
  • 它不是“字符串比较”的重复。
  • @ArnaudDenoyelle 我同意你的观点,我收到了没有解释的反对票。
  • @LucienNestler 您不应将 String 与 == 进行比较,而应将其与 String.equals 进行比较。在这个用例中,它可能会偶然工作(因为 vm 优化)但代码无效

标签: java loops iterator


【解决方案1】:

您的代码有效(在修复了new ArrayList&lt;String&gt; 之后错过的() 并将== 替换为比较字符串的正确方法equals 之后:

import java.util.*;

public class test
{
    public static void main(String[] args) {
        List<String> bar = new ArrayList<String>();
        bar.add("foobar");
        ListIterator<String> quux = bar.listIterator();
        while(quux.hasNext()) {
            if(quux.next().equals("foobar")) {
                quux.add("baz");
            }
        }
        System.out.println(bar);
    }
}

返回:

[foobar, baz]

如您所见,baz 已插入。

【讨论】:

  • 感谢您的快速回答,我在本网站的代码中添加了缺失的 (),但我比较的对象并不是真正的字符串,我只是使用字符串来简化问题,因为我正在使用自定义类,实际上我进入了 if-Branch,我在其中调用 add 函数只是为了看到迭代器中没有任何变化。
  • @LucienNestler 不客气。请将我的答案标记为已接受并投票。如果您使用 reral 类型对此提出新问题,我会回答它
【解决方案2】:

您似乎希望能够使用next() 获取添加的元素:

ListIterator 也没有获得新元素

[...]

在这个函数结束时,我希望 ListIterator 包含新的字符串“baz”。但是,当我调用 hasNext() 方法时,它返回 false

但是,JavaDoc 用于 ListIterator.add() 明确指出情况并非如此:

新元素插入到隐式光标之前:对 next 的后续调用不受影响


如果你想在迭代中包含元素,你可以将列表迭代器回退一个位置:

    if(quux.next().equals("foobar")) {
        quux.add("baz");
        quux.previous();
    }

【讨论】:

  • 哦,谢谢,看来我读多了,有没有办法也迭代新元素?
猜你喜欢
  • 2011-02-05
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
相关资源
最近更新 更多