You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java ListIterator如何实现每次操作仅单次迭代切换播放列表歌曲?

问题根因
  • 核心问题:用户输入读取逻辑放在了while(!quit)循环外部,程序仅会在首次进入循环前读取一次用户输入,后续循环会一直复用第一次录入的数值,因此选择一次「下一首」后就会反复触发case1逻辑,直观表现就是break语句被忽略、持续遍历列表直到末尾后重复打印末尾提示。
  • 隐藏bug1:case2的方向切换逻辑中,错误调用了listIterator.hasPrevious()而非listIterator.previous(),没有实际移动迭代器指针,会导致切换上一首的逻辑执行异常。
  • 隐藏bug2:case3分支末尾缺少break语句,执行完重播逻辑后会直接进入下一轮循环,可能引发意料外的逻辑问题。
修复后代码
public static void playSongs(LinkedList<Song> playList){
    boolean quit = false;
    int userInput;
    boolean forward = true; // 跟踪迭代器移动方向
    ListIterator<Song> listIterator = playList.listIterator();
    if(playList.isEmpty()){
        System.out.println("No songs in playlist");
        return;
    }else{
        System.out.println("Now Playing " + listIterator.next().getTitle());
        printMenu();
    }
    // 输入读取移入循环内部
    while(!quit){
        userInput = scanner.nextInt();
        scanner.nextLine();
        switch(userInput){
            case 0:
                System.out.println("Exiting playlist");
                quit = true;
                break;
            case 1: 
                if(!forward){
                    if (listIterator.hasNext()){
                        listIterator.next();
                    }
                    forward = true;
                }
                if(listIterator.hasNext()){
                    System.out.println("Now Playing " + listIterator.next().getTitle());
                }else{
                    System.out.println("Reached end of playlist");
                    forward = false;
                }
                break;
            case 2:
                if(forward) {
                    if (listIterator.hasPrevious()) {
                        // 修正hasPrevious为previous,实际移动指针
                        listIterator.previous();
                    }
                    forward = false;
                }
                if(listIterator.hasPrevious()){
                    System.out.println("Now playing: " + listIterator.previous().getTitle());
                }else{
                    System.out.println("Already at beginning of playlist");
                    forward = true;
                }
                break;
            case 3:
                if(forward){
                    if(listIterator.hasPrevious()){
                        System.out.println("Now replaying " + listIterator.previous().getTitle());
                        forward = false;
                    }else {
                        System.out.println("Replaying first song");
                    }
                }else{
                    if(listIterator.hasNext()){
                        System.out.println("Now replaying " + listIterator.next().getTitle());
                        forward = true;
                    }else{
                        System.out.println("Replaying last song in list");
                    }
                }
                // 补全break
                break;
        }
        // 可选:每次操作后重新打印菜单,方便用户选择
        printMenu();
    }
}
核心修改说明
  • 将用户输入读取逻辑移入while循环内部,每次执行操作前都获取最新的用户指令,保证每次选择仅触发一次对应操作
  • 修正case2中迭代器指针移动的错误调用,保证切换方向时指针位置正确
  • 补全case3的break语句,避免分支穿透
  • 可选在每次操作结束后打印操作菜单,优化交互体验

内容的提问来源于stack exchange,提问作者mbflint

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:54:02