【问题标题】:Why combination of hasPrevious() and add() in listiterator goes into infinite looping ,while hasNext() and add() doesn't?为什么 listiterator 中的 hasPrevious() 和 add() 组合进入无限循环,而 hasNext() 和 add() 没有?
【发布时间】:2020-04-29 21:17:37
【问题描述】:

有两个元素的ArrayList

     ArrayList<String> a = new ArrayList<String>() { 
        {
            add("hai");
            add("hello");
        }
    };

为该列表创建了一个列表迭代器

   ListIterator l = a.listIterator();

使用 next 遍历并在列表中添加一个元素“bye”

   while (l.hasNext()) {              

        l.next();
        l.add("bye");

    }
    System.out.println(a);

以上代码的输出为= [hai,bye,hello,bye]

遍历到列表的最后一个

    while(l.hasNext()) {             
        l.next();
    }

使用 prev 向前遍历并在列表中添加一个元素“bye”

    while (l.hasPrevious()) {         

        l.previous();
        l.add("bye");

    }
    System.out.println(a);

无限循环,什么也不打印!!!

【问题讨论】:

  • 最后一个while循环是否独立于其他循环?或者你把上面所有的代码一起运行?
  • @MohammedDeifalah 最后两个while循环将同时执行,因为我必须遍历到最后一个才能向前遍历!
  • @GowthamPrasath 然后,在最后一个循环中,您正在做的是,如第一个答案中所述,您转向最后两个元素之间的位置。然后添加另一个元素。然后你再次转向相同的位置......等等。这是一个无限循环。
  • @MohammedDeifalah 我使用 next() 做了同样的事情,但我没有进入无限循环,只有 previous() 这样做

标签: java collections iterator


【解决方案1】:

好吧,ListIteratoradd 的 Javadoc 解释说:

将指定元素插入到列表中(可选操作)。该元素被插入到将由 next 返回的元素之前(如果有),并在将由 previous 返回的元素(如果有)之后插入。 (如果列表不包含任何元素,则新元素将成为列表中的唯一元素。)新元素插入到隐式光标之前:对 next 的后续调用将不受影响,并且 对 previous 的后续调用将返回新元素

l.previous 返回您刚刚通过l.add("bye") 添加的元素,因此您永远不会到达List 的开头。因此是无限循环。

如果List 看起来像这样:

hai       hello
                    ^
                    |
                  cursor

调用l.previous(); 返回“hello”并将光标移回:

hai            hello
        ^
        |
      cursor

调用l.add("bye"); 会在“hai”和“hello”之间以及光标之前添加新元素:

hai      bye      hello
              ^
              |
            cursor

所以下一次调用l.previous() 将返回“再见”。

因此,您的循环将永远不会到达 List 的开头。

【讨论】:

猜你喜欢
  • 2016-09-14
  • 1970-01-01
  • 2011-01-12
  • 2018-10-15
  • 1970-01-01
  • 2017-10-18
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多