如何在PriorityQueue中实现多级Comparator比较逻辑?
实现多级工作场所排序逻辑的方案
方法一:基于现有Comparator扩展(推荐)
你已经有了按所需工人数排序的comp,可以直接利用Comparator的thenComparing方法追加二级排序规则,代码简洁且可读性强:
代码示例
// 假设Workplaces类提供以下方法: // int getRequiredWorkers() —— 获取所需工人数 // double getAverageDistanceToWorkers() —— 获取到所有工人的平均距离 Comparator<Workplaces> multiLevelComp = comp // 当所需工人数相同时,按平均距离升序排列(距离更短的优先) .thenComparing(Workplaces::getAverageDistanceToWorkers); PriorityQueue<Workplaces> workplaces = new PriorityQueue<>(multiLevelComp);
如果你的原始comp是按所需工人数降序(需求多的优先)设计的,这个逻辑完全适配:当第一级比较返回0(人数相同)时,会自动触发二级比较,确保距离短的工作场所优先被分配。
方法二:自定义完整Comparator
如果希望把所有排序逻辑集中在一个Comparator里,可以直接实现compare方法:
代码示例
Comparator<Workplaces> multiLevelComp = (wp1, wp2) -> { // 第一级:按所需工人数降序比较 int workerCountCompare = Integer.compare(wp2.getRequiredWorkers(), wp1.getRequiredWorkers()); if (workerCountCompare != 0) { return workerCountCompare; } // 第二级:人数相同时,按平均距离升序比较 return Double.compare(wp1.getAverageDistanceToWorkers(), wp2.getAverageDistanceToWorkers()); }; PriorityQueue<Workplaces> workplaces = new PriorityQueue<>(multiLevelComp);
注意:如果你的原始comp是升序逻辑,需要调整Integer.compare的参数顺序来实现降序(比如把wp2的工人数放在前面)。
方法三:不使用PriorityQueue的替代方案
如果不需要动态添加工作场所的场景,可以将所有工作场所放入List,一次性排序后按顺序分配:
代码示例
List<Workplaces> workplaceList = new ArrayList<>(); // 填充工作场所数据... // 应用多级排序规则 workplaceList.sort(multiLevelComp); // 按排序后的顺序执行工人分配 for (Workplaces wp : workplaceList) { // 此处编写分配逻辑 }
这种方式逻辑更直观,适合数据固定的批量分配场景。
内容的提问来源于stack exchange,提问作者el Kusn
相关产品推荐
相关产品推荐

