【问题标题】:Is iterator's rule of Iterator and Listiterator different from each other?(Java)Iterator和Listiterator的迭代器规则是否不同?(Java)
【发布时间】:2020-09-01 14:34:15
【问题描述】:

我正在练习 Java 代码 - iteratorlistIterator
并且很难理解下面代码的结果。

代码

import java.util.*;

public class ListIteratorCollection {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("A","B","C","D");
        list = new ArrayList<>(list);

        ListIterator<String> litr = list.listIterator();
        String str;

        while(litr.hasNext()){
            str = litr.next();
            System.out.print(str + '\t');
            if(str.equals("A"))
                litr.add("A-add");
        }
        System.out.println();

        while(litr.hasPrevious()){
            str = litr.previous();
            System.out.print(str + '\t');
            if(str.equals("C"))
                litr.add("C-add");
        }
        System.out.println();

        for(Iterator<String> itr = list.iterator(); itr.hasNext();)
            System.out.print(itr.next() + '\t');
        System.out.println();
    }
}

结果

A B C D
D C C-加 B A-加 A
A A-加 B C-加 C D

我想知道为什么不打印A-add(在第一个while循环中),但打印C-add(在第二个while循环中)。 它们都是新添加到现有列表中的,while 循环结构相似(我认为?)。

谁能解释一下?

【问题讨论】:

    标签: java list iterator


    【解决方案1】:

    这是ListIterator.add的文档解释的:

    [...] 新元素插入到隐式光标之前:后续调用 next 将不受影响,后续调用 previous 将返回新元素。

    所以在你的例子中(^ 表示光标)

    1. 第一次迭代(向前):
      A B C D
       ^ →
      
      // litr.add("A-add");
      A A-add B C D
             ^ →
      
    2. 第二次迭代(向后)
      A A-add B C D
             ← ^
      
      // litr.add("C-add");
      A A-add B C-add C D
                   ← ^
      
    3. 第三次迭代(向前)
       A A-add B C-add C D
      ^ →
      

    【讨论】:

      猜你喜欢
      • 2012-06-14
      • 1970-01-01
      • 2016-04-21
      • 2017-09-07
      • 1970-01-01
      • 2016-10-26
      • 2013-11-16
      • 1970-01-01
      • 2012-06-14
      相关资源
      最近更新 更多