【问题标题】:ListIterator Strange Adding to ArrayListListIterator 奇怪的添加到 ArrayList
【发布时间】:2012-12-19 16:22:04
【问题描述】:

我有以下代码:

    ArrayList<String> words;
    words = new ArrayList<String>();
    words.add("is");
    words.add("us");
    ListIterator<String> it;
    it = words.listIterator();
    it.add("##");
    System.out.println(words);
    it.next();
    it.next();
    it.previous();
    it.set("##");
    System.out.println(words);

我希望输出是## us ##,但是当我运行程序时它返回## is ##。我希望这与ListIteratorArrayList 添加项目而不是ArrayList 向其自身添加项目有关。

为什么程序会这样?

【问题讨论】:

  • 你的程序比它需要的复杂很多,有一个add和一个set,以及移动下一个和上一个。不清楚为什么你会期待“## us ##”的结果。

标签: java linked-list listiterator


【解决方案1】:

您的问题不清楚,但我怀疑您可能缺少的要点是 ListIterator.add 在当前位置插入:

该元素被插入到 next() 将返回的下一个元素(如果有)之前,以及在 previous() 将返回的下一个元素(如果有)之后。

还有:

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

因此,在您初次调用 it.add("##") 后,列表包含 "##""is" "us"。然后您接下来移动两次 - 第一次将光标移动到 "is" 之后(返回)。第二个将光标移动到 "us" 之后(返回)。然后对previous() 的调用再次返回"us",最后对set() 的调用将"us" 替换为"##"

将 next() 或 previous() 返回的最后一个元素替换为指定的元素(可选操作)。

看起来它完全遵守了文档。不幸的是,不清楚这些步骤中的哪一个让您感到困惑,因为您将这么多步骤混为一谈。

【讨论】:

  • 感谢您的回复,对于我的问题缺乏针对性,我深表歉意。这段代码是我的 CS 课程中的一个示例,它(正如您所提到的)是一种过度复杂代码的强烈冲动。我包含了整个 sn-p 只是为了确保我没有意外排除可能使其返回结果的行。再次感谢。
猜你喜欢
  • 2016-03-12
  • 1970-01-01
  • 2021-01-08
  • 2018-07-05
  • 2013-10-11
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多