Java Queue队列遍历时元素提前耗尽 未达目标就退出循环问题
问题根因
程序提前退出的核心原因是for循环的终止条件设计错误,和队列动态变化的特性不匹配:
- 初始状态下队列
peopleInQueue共7个元素,循环每次执行peopleInQueue.poll()移除队首元素后,队列的size()返回值会同步减1 - 同时循环变量
i每次迭代固定自增1,两个值反向变化,导致循环提前满足终止条件,逐次核对循环执行状态如下:- 初始:i=0,队列长度=7,
0<7成立,处理Bruce Banner,移除元素后队列长度=6,i自增为1 - 第2次判断:i=1,队列长度=6,
1<6成立,处理Steve Rogers,移除后队列长度=5,i自增为2 - 第3次判断:i=2,队列长度=5,
2<5成立,处理Tony Stark,移除后队列长度=4,i自增为3 - 第4次判断:i=3,队列长度=4,
3<4成立,处理Natalia Romanova,移除后队列长度=3,i自增为4 - 第5次判断:i=4,队列长度=3,
4<3不成立,循环直接终止
- 初始:i=0,队列长度=7,
- 循环终止时队列内还剩Peter Parker、You、-1三个元素,完全没走到判断
You的分支,和预期逻辑不符。
另外代码还有一个小瑕疵:购票提示的字符串拼接缺少空格,会输出Bruce Bannerhas purchased a ticket的错误格式,和预期输出不一致。
修复方法
处理这种动态出队的场景,不需要依赖自增计数的for循环,直接用while循环持续判断队首元素即可,逻辑更贴合队列的操作特性:
- 只要队列不为空,就取出队首元素判断
- 如果队首是
You,输出购票提示后终止循环 - 否则移除队首,更新排队位置,输出对应提示
- 补全字符串拼接缺失的空格
修复后的完整代码如下:
import java.util.LinkedList; import java.util.Queue; class Main { public static void main (String[] args) { Queue<String> peopleInQueue = new LinkedList<>(); peopleInQueue.add("Bruce Banner"); peopleInQueue.add("Steve Rogers"); peopleInQueue.add("Tony Stark"); peopleInQueue.add("Natalia Romanova"); peopleInQueue.add("Peter Parker"); peopleInQueue.add("You"); peopleInQueue.add("-1"); int youPosition = 6; System.out.println("Welcome to the ticketing service... "); System.out.println("You are number " + youPosition + " in the queue."); // 替换原错误for循环,用while循环持续判断队首元素 while (!peopleInQueue.isEmpty()){ String name = peopleInQueue.peek(); if(name.equals("You")){ System.out.println("You can now purchase your ticket!"); break; } else{ youPosition--; peopleInQueue.poll(); // 补全name后缺失的空格 System.out.println(name + " has purchased a ticket."); System.out.println("You are now number "+ youPosition); } } } }
运行修复后的代码即可完全匹配预期输出。
内容的提问来源于stack exchange,提问作者Brownbp
相关产品推荐
相关产品推荐

