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

基于ArrayList实现的对象队列QuickSort实现与类型转换异常解决

问题解答

一、队列排序的实际应用场景

实际开发中队列排序的需求非常普遍,典型场景包括:

  • 任务调度系统:批量执行的任务队列通常需要按照任务优先级、执行截止时间排序,优先处理高优先级、即将超时的任务
  • 电商订单处理队列:大促期间的订单队列会按照会员等级、订单实付金额排序,优先处理高等级会员、高价值订单
  • 医疗分诊队列:医院门诊的挂号队列需要按照患者病情紧急程度、挂号时间排序,优先安排急症患者、早挂号患者就诊
  • 消息中间件延迟队列:需要按照消息的过期时间排序,优先投递即将达到触发条件的消息

二、异常原因排查与解决方案

异常根本原因

你遇到的java.lang.ClassCastException是代码逻辑错误导致的类型不匹配:你在快速排序代码中定义的int pivot = queue.size() - 1是pivot元素的下标索引,属于Integer类型,但你直接把这个下标值当成Person对象调用lesser.enqueue(pivot)塞进了存储Person对象的队列,后续代码从队列中取出该值做Person类型操作时就触发了类型转换异常。

修复方案

你需要修改QuickSort类的排序逻辑,同时补充泛型声明避免类型擦除问题:

  1. 先取出pivot下标对应的Person对象,再塞入队列
  2. 修复greater队列的遍历逻辑:原for循环判断条件j < greater.size()会因为每次dequeue导致size变小,出现遍历不全的问题,替换为while循环判断队列是否为空
  3. 所有Queue实例声明时补充泛型,避免使用裸类型

修改后的快速排序方法示例(以quickSortAge为例,quickSortLastName逻辑完全一致):

protected Queue<Person> quickSortAge(Queue<Person> queue) throws Exception {
    if (queue.size() <= 1) {
        return queue;
    }
    Queue<Person> lesser = new Queue<>();
    Queue<Person> greater = new Queue<>();
    int pivotIndex = queue.size() - 1;
    // 取出pivot对应的Person对象
    Person pivotPerson = queue.get(pivotIndex);
    for (int i = 0; i < queue.size() - 1; i++) {
        if (compareAge(queue.get(i), pivotPerson) < 0){
            lesser.enqueue(queue.get(i));
        }
        else {
            greater.enqueue(queue.get(i));
        }
    }

    lesser = quickSortAge(lesser);
    greater = quickSortAge(greater);

    // 塞入pivot对象而不是下标
    lesser.enqueue(pivotPerson);
    // 修复遍历逻辑
    while (!greater.isEmpty()) {
        lesser.enqueue(greater.dequeue());
    }
    return lesser;
}

另外还要修改Main类中队列初始化的代码,补充泛型声明:

// 原代码:Queue queue = new Queue();
Queue<Person> queue = new Queue<>();

内容的提问来源于stack exchange,提问作者KillerSheltie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:42:02