【问题标题】:Iterator.iter() returns same valuesIterator.iter() 返回相同的值
【发布时间】:2021-11-30 14:39:17
【问题描述】:

我正在开发一个实现歌曲播放列表的简单 Java 项目。我的程序应该能够将歌曲添加到播放列表,并具有向前跳、重复和向后跳的功能。我正在尝试编写一个简单的方法,调用时会跳过歌曲,但它总是返回相同的元素。 请阅读下面代码中的 cmets 以更好地理解我的问题。

这是一个简化的例子:

import java.util.LinkedList;
import java.util.ListIterator;

public class testClass {

    public static void main(String[] args) {

        LinkedList<String> list = new LinkedList<>();
        // Add elements to the list. 
        list.add("First Element");
        list.add("Second Element");
        list.add("Third Element");
        
        ListIterator<String> iter = list.listIterator();
        // If I call this method it works and returns next elements.
        System.out.println(iter.next()); 
        System.out.println(iter.next()); 
        System.out.println("======================");
        // However this method returns same elements no matter how  many times I call it.
        // Why does this happen and how can I fix it ? 
        skip(list); 
        skip(list); 
        // outputs : 
        //First Element
        //Second Element
        ==================
        //First Element
        //First Element
    }
    public static void skip(LinkedList<String> stringList) {
        ListIterator<String> iter = stringList.listIterator();
        if(iter.hasNext())
            System.out.println(iter.next());
    }

}

【问题讨论】:

  • 每次你的skip方法调用stringList.listIterator(),都会返回一个全新的迭代器,它指向列表的开始。

标签: java iterator


【解决方案1】:

您需要在 while 循环中进行迭代,而不是在 if 语句中。我已将您的方法修改为:

public static void skip(LinkedList<String> stringList) {
        ListIterator<String> iter = stringList.listIterator();
        while (iter.hasNext())
            System.out.println(iter.next());
    }

【讨论】:

    【解决方案2】:

    那是因为你调用skip(list); 两次,每次调用它都会从第一项开始。

    .next() 的语句在打印后移动到列表中的下一个索引,您只需删除skip(list); 之一并将您的跳过函数编辑为如下所示:

        public static  void skip(LinkedList<String> stringList) {
        ListIterator<String> iter = stringList.listIterator();
        if(iter.hasNext()){
            System.out.println(iter.next());
            System.out.println(iter.next());
        }
            
    }
    

    或像这样打印列表中的所有项目:

        public static void skip(LinkedList<String> stringList) {
        ListIterator<String> iter = stringList.listIterator();
         while (iter.hasNext())
            System.out.println(iter.next());  
    }
    

    【讨论】:

      猜你喜欢
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 1970-01-01
      • 2020-04-10
      • 2010-09-22
      相关资源
      最近更新 更多