Java队列作业咨询:单队列内按红、蓝、黄顺序排序的实现方法
单队列实现票证按颜色优先级排序
要在仅使用一个队列的前提下,实现red优先、blue次之、yellow最后的排序,可以利用队列的**先进先出(FIFO)**特性,通过两次遍历队列完成排序:
具体步骤
- 第一次遍历队列:将所有非red的票移动到队列尾部,直到队列中所有red票都集中在队首
- 第二次遍历队列:在剩余的非red票中,将所有非blue的票移动到队列尾部,此时队列前半部分是red,中间是blue,最后是yellow
修改后的代码
import java.util.LinkedList; import java.util.Queue; import java.util.Random; public class TestQueueTwo { public static void main(String[] args) { Random random = new Random(); String color = " "; String ticket; int listSize = 5; int attendants = 2; String[] colors = {"red", "blue", "yellow"}; Queue<String> tickets = new LinkedList<>(); // 生成随机票证入队 while(tickets.size() < listSize) { color = colors[random.nextInt(3)]; ticket = color + (random.nextInt(listSize) + 1); tickets.add(ticket); } // 第一步:把所有red票移到队首 int originalSize = tickets.size(); for (int i = 0; i < originalSize; i++) { String current = tickets.poll(); if (current.startsWith("red")) { tickets.add(current); } else { // 非red票先移到队尾 tickets.add(current); } } // 统计red票的数量,确定第二次遍历的起始位置 int redCount = 0; for (String t : tickets) { if (t.startsWith("red")) { redCount++; } else { break; } } // 第二步:处理剩余的非red票,把blue移到red之后 for (int i = 0; i < originalSize - redCount; i++) { String current = tickets.poll(); if (current.startsWith("blue")) { tickets.add(current); } else { tickets.add(current); } } // 输出排序后的队列 System.out.println("排序后的票证队列:"); while (!tickets.isEmpty()) { System.out.print(tickets.poll() + " "); } } }
代码说明
- 第一次遍历:循环次数等于队列初始长度,确保每个元素都被检查一次,非red元素重新入队到尾部,最终所有red元素会集中在队列前端
- 统计red元素数量后,第二次遍历只处理剩余的非red元素,将blue元素保留在red之后,yellow元素自然被移到最后
- 整个过程始终只使用一个队列,符合练习要求
内容的提问来源于stack exchange,提问作者Henrique de Liz
相关产品推荐
相关产品推荐

