【问题标题】:java - iterating a linked listjava - 迭代一个链表
【发布时间】:2011-06-13 15:34:04
【问题描述】:

如果我在 java 中的链表上使用 for-each 循环, 是否保证我会按顺序迭代元素 它们出现在列表中的哪个位置?

【问题讨论】:

    标签: java linked-list


    【解决方案1】:

    链表保证按顺序执行。

    来自documentation

    有序集合(也称为 顺序)。该界面的用户 有精确的控制在哪里 列出每个插入的元素。这 用户可以通过他们的访问元素 整数索引(列表中的位置), 并在列表中搜索元素。

    iterator() 以正确的顺序返回此列表中元素的迭代器。

    【讨论】:

      【解决方案2】:

      每个 java.util.List 实现都需要保留顺序,因此您可以使用 ArrayList、LinkedList、Vector 等。它们中的每一个都是有序集合,并且它们中的每一个都保留插入的顺序(参见 http://download.oracle.com/javase/1.4.2/docs/api/java/util/List.html

      【讨论】:

        【解决方案3】:

        正如Linkedlist的定义所说,它是一个序列,你可以保证按顺序获取元素。

        例如:

        import java.util.LinkedList;
        
        public class ForEachDemonstrater {
          public static void main(String args[]) {
            LinkedList<Character> pl = new LinkedList<Character>();
            pl.add('j');
            pl.add('a');
            pl.add('v');
            pl.add('a');
            for (char s : pl)
              System.out.print(s+"->");
          }
        }
        

        【讨论】:

          【解决方案4】:

          我发现了 5 种在 Java 中迭代链表的主要方法(包括 Java 8 方式):

          1. For 循环
          2. 增强的 For 循环
          3. While 循环
          4. 迭代器
          5. 集合的 stream() 实用程序 (Java8)

          For循环

          LinkedList<String> linkedList = new LinkedList<>();
          System.out.println("==> For Loop Example.");
          for (int i = 0; i < linkedList.size(); i++) {
              System.out.println(linkedList.get(i));
          }
          

          增强的 for 循环

          for (String temp : linkedList) {
              System.out.println(temp);
          }
          

          While循环

          int i = 0;
          while (i < linkedList.size()) {
              System.out.println(linkedList.get(i));
              i++;
          }
          

          迭代器

          Iterator<String> iterator = linkedList.iterator();
          while (iterator.hasNext()) {
              System.out.println(iterator.next()); 
          }
          

          收集流()实用程序(Java 8)

          linkedList.forEach((temp) -> {
              System.out.println(temp);
          });
          

          需要指出的是,For循环While循环的运行时间是O(n平方),因为get(i)的操作需要O(n)时间(see this for details)。其他 3 种方式需要线性时间并且性能更好。

          【讨论】:

          • 太棒了。我不知道 LinkedList.size() 。 +1。
          • 对于迭代只使用linkedList.forEach(e -> System.out.println(e));也可以。
          • 线性时间和O(n)是一样的,不是吗?
          • @pooria 是的,它们是一样的。
          • 关于迭代器解决方案的问题。这是创建一个复制 LinkedList 的所有元素的新内存结构,还是创建一个包含对 LinkedList 中每个元素的值的引用(指针?)的新内存结构?为什么这比使用 get(i) 解决方案更快?是不是因为 get(i) 必须遍历树,至少部分地,linkedList.size() 次才能获取下一个元素的地址?”(应该是 linkedList.size()*(linkedList.size( )+1)/2 次,对吧?)
          【解决方案5】:

          链表确实保证顺序。

          不要使用 linkedList.get(i),尤其是在顺序循环中,因为它违背了使用链表的目的并且是低效的代码。

          使用 ListIterator

              ListIterator<Object> iterator = myLinkedList.listIterator();
              while( iterator.hasNext()) {
                  System.out.println(iterator.next());
              }
          

          【讨论】:

            【解决方案6】:
            iterate LinkedList by using iterator
            
            LinkedList<String> linkedList = new LinkedList<String>();
            linkedList.add(“Mumbai”);
            linkedList.add(“Delhi”);
            linkedList.add(“Noida”);
            linkedList.add(“Gao”);
            linkedList.add(“Patna”);
            
            Iterator<String>  itr = linkedList.iterator();
             while (itr.hasNext()) {
             System.out.println(“Element is =”+itr.next());
            
             }
            

            参考:Java Linkedlist Examples

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2015-07-14
              • 2016-09-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多