【问题标题】:The following code with listiterator is running infinitely以下带有 listiterator 的代码无限运行
【发布时间】:2019-01-17 02:53:22
【问题描述】:

我正在尝试使用以前的方法使用 listiterator 遍历列表。在循环中如果我尝试使用 listiterator.add 方法添加元素,则循环将无限迭代

我尝试调试代码,但找不到确切原因

public static methodOne() {
    List l = new ArrayList();
    for(int i = 0; i < 5; i++) {
     l.add(i);
    }
    ListIterator li = l.listIterator();
    while(li.hasNext()) {
     li.next();
    }
    while(li.hasPrevious()) {
     Integer i = (Integer)li.previous();
     li.add(56);
    }
    System.out.println(l);
}

我希望输出为 56,0,1,56,2,56,3,56,4,56,5

【问题讨论】:

    标签: java collections listiterator


    【解决方案1】:

    您的最后一个循环无限运行,因为您不断添加一个元素并检查它是否有以前的。当然有以前的,就是你刚刚添加的那个。

    你可以通过以下方式实现你想要的:-

    List<Integer> list = IntStream.range(0, 5)
            .flatMap(i -> IntStream.of(56, i))
            .boxed()
            .collect(Collectors.toList());
    System.out.println(list);
    

    输出

    [56, 0, 56, 1, 56, 2, 56, 3, 56, 4]
    

    【讨论】:

      【解决方案2】:

      如果您阅读文档,即ListIterator.add() 的javadoc,您将看到:

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

      因此,交替调用previous()add() 将使插入值保持在列表中的相同位置,因此永远不会结束(直到内存耗尽)。

      要显示发生了什么,请尝试以下代码:

      public static void main(String[] args) {
          List<Integer> list = new ArrayList<>(Arrays.asList(10, 20, 30, 40));
          ListIterator<Integer> listIter = list.listIterator(list.size());
          print(list, listIter); // Iterator is at end (after 40)
      
          System.out.println("previous(): " + listIter.previous()); // prints: 40
          print(list, listIter); // Iterator is between 30 and 40
      
          for (int i = 39; i >= 31; i--) {
              listIter.add(i);   System.out.printf("add(i)%n", i);
              print(list, listIter);
      
              System.out.println("previous(): " + listIter.previous());
              print(list, listIter);
          }
      }
      static void print(List<Integer> list, ListIterator<Integer> listIter) {
          for (Integer i : list)
              System.out.printf("%5d", i);
          System.out.printf("%n%" + (listIter.nextIndex() * 5 + 2) + "s%n", "^");
      }
      

      输出

         10   20   30   40
                           ^
      previous(): 40
         10   20   30   40
                      ^
      add(i)
         10   20   30   39   40
                           ^
      previous(): 39
         10   20   30   39   40
                      ^
      add(i)
         10   20   30   38   39   40
                           ^
      previous(): 38
         10   20   30   38   39   40
                      ^
      add(i)
         10   20   30   37   38   39   40
                           ^
      previous(): 37
         10   20   30   37   38   39   40
                      ^
      add(i)
         10   20   30   36   37   38   39   40
                           ^
      previous(): 36
         10   20   30   36   37   38   39   40
                      ^
      add(i)
         10   20   30   35   36   37   38   39   40
                           ^
      previous(): 35
         10   20   30   35   36   37   38   39   40
                      ^
      add(i)
         10   20   30   34   35   36   37   38   39   40
                           ^
      previous(): 34
         10   20   30   34   35   36   37   38   39   40
                      ^
      add(i)
         10   20   30   33   34   35   36   37   38   39   40
                           ^
      previous(): 33
         10   20   30   33   34   35   36   37   38   39   40
                      ^
      add(i)
         10   20   30   32   33   34   35   36   37   38   39   40
                           ^
      previous(): 32
         10   20   30   32   33   34   35   36   37   38   39   40
                      ^
      add(i)
         10   20   30   31   32   33   34   35   36   37   38   39   40
                           ^
      previous(): 31
         10   20   30   31   32   33   34   35   36   37   38   39   40
                      ^
      

      【讨论】:

        猜你喜欢
        • 2015-08-17
        • 1970-01-01
        • 2023-02-04
        • 1970-01-01
        • 2021-03-15
        • 2023-03-24
        • 2016-09-14
        • 1970-01-01
        相关资源
        最近更新 更多