如何对队列内存储的int数组元素按数值升序排序并输出
队列数组升序打印解决方案
原代码存在的问题
- 仅单次比较相邻元素,没有全队列排序逻辑,多元素乱序时输出结果不符合要求
- 条件判断中误用位运算符
&,应使用逻辑与运算符&& - 代码语法存在缺陷,循环缺少闭合的右大括号
- 普通FIFO队列本身没有从队头插入元素的API,你如果需要保留不需要立刻处理的队头元素,直接调用
add方法把它放回队尾即可,相当于循环遍历队列元素。
方案1:导出到列表排序(推荐,实现简单性能高)
如果允许将队列元素导出到其他集合处理,直接转列表自定义规则排序即可,代码如下:
import java.util.ArrayList; import java.util.List; import java.util.Queue; // 假设队列变量名为queue,类型为Queue<int[]> List<int[]> tempList = new ArrayList<>(); // 导出所有队列元素 while (!queue.isEmpty()) { tempList.add(queue.remove()); } // 自定义排序规则:先按数组第一个元素升序,相等则按第二个元素升序 tempList.sort((o1, o2) -> { if (o1[0] != o2[0]) { return o1[0] - o2[0]; } return o1[1] - o2[1]; }); // 按要求格式打印 for (int[] arr : tempList) { System.out.printf("{%d, %d},%n", arr[0], arr[1]); } // 若需要排序后的元素放回原队列,遍历tempList调用queue.add(arr)即可
方案2:仅使用队列基础操作实现排序
如果要求只能使用队列的add、remove、peek基础API,不允许转其他集合,可以用类似选择排序的思路实现,每一轮遍历全队列找出当前最小元素打印,剩余元素放回队列,代码如下:
import java.util.Queue; int elementCount = queue.size(); // 共需要遍历elementCount轮,每轮取出一个最小元素 for (int i = 0; i < elementCount; i++) { int[] currentMin = queue.remove(); int roundSize = queue.size(); // 遍历本轮剩余所有元素,找到最小值 for (int j = 0; j < roundSize; j++) { int[] temp = queue.remove(); boolean isSmaller = false; if (temp[0] < currentMin[0]) { isSmaller = true; } else if (temp[0] == currentMin[0] && temp[1] < currentMin[1]) { isSmaller = true; } if (isSmaller) { // 临时元素更小,将原最小值放回队列,更新最小值 queue.add(currentMin); currentMin = temp; } else { // 临时元素更大,直接放回队列 queue.add(temp); } } // 打印本轮找到的最小值 System.out.printf("{%d, %d},%n", currentMin[0], currentMin[1]); }
方案3:使用优先级队列直接实现排序出队
如果你可以自行选择队列实现,直接用Java自带的PriorityQueue(优先级队列),初始化时指定排序规则,元素入队后直接按顺序出队就是你需要的升序结果:
import java.util.PriorityQueue; import java.util.Queue; // 初始化优先级队列,指定排序规则 Queue<int[]> priorityQueue = new PriorityQueue<>((o1, o2) -> { if (o1[0] != o2[0]) return o1[0] - o2[0]; return o1[1] - o2[1]; }); // 所有元素入队后,逐个出队打印即可 while (!priorityQueue.isEmpty()) { int[] arr = priorityQueue.poll(); System.out.printf("{%d, %d},%n", arr[0], arr[1]); }
内容的提问来源于stack exchange,提问作者chickennugget
相关产品推荐
相关产品推荐

