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

如何对队列内存储的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:54:01