基于ArrayList实现的对象队列QuickSort实现与类型转换异常解决
问题解答
一、队列排序的实际应用场景
实际开发中队列排序的需求非常普遍,典型场景包括:
- 任务调度系统:批量执行的任务队列通常需要按照任务优先级、执行截止时间排序,优先处理高优先级、即将超时的任务
- 电商订单处理队列:大促期间的订单队列会按照会员等级、订单实付金额排序,优先处理高等级会员、高价值订单
- 医疗分诊队列:医院门诊的挂号队列需要按照患者病情紧急程度、挂号时间排序,优先安排急症患者、早挂号患者就诊
- 消息中间件延迟队列:需要按照消息的过期时间排序,优先投递即将达到触发条件的消息
二、异常原因排查与解决方案
异常根本原因
你遇到的java.lang.ClassCastException是代码逻辑错误导致的类型不匹配:你在快速排序代码中定义的int pivot = queue.size() - 1是pivot元素的下标索引,属于Integer类型,但你直接把这个下标值当成Person对象调用lesser.enqueue(pivot)塞进了存储Person对象的队列,后续代码从队列中取出该值做Person类型操作时就触发了类型转换异常。
修复方案
你需要修改QuickSort类的排序逻辑,同时补充泛型声明避免类型擦除问题:
- 先取出pivot下标对应的Person对象,再塞入队列
- 修复greater队列的遍历逻辑:原for循环判断条件
j < greater.size()会因为每次dequeue导致size变小,出现遍历不全的问题,替换为while循环判断队列是否为空 - 所有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
相关产品推荐
相关产品推荐

