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
相关产品推荐
相关产品推荐

