如何按分类内最小eventOrder排序Event列表,可否用Comparator实现
解决方案
可以通过自定义Comparator实现该需求,具体实现步骤如下:
步骤1:预处理获取各分类的最小eventOrder
首先遍历一次所有Event对象,构建分类ID和对应分类下最小eventOrder的映射表(需先给Event类添加属性对应的getter方法):
Map<Integer, Integer> categoryMinOrderMap = events.stream() .collect(Collectors.toMap( Event::getCategoryId, Event::getEventOrder, Integer::min // 同一个分类保留最小的eventOrder ));
步骤2:自定义Comparator排序
基于上述映射表实现排序规则:
events.sort((e1, e2) -> { // 第一排序规则:按所属分类的最小eventOrder升序排列 int categoryOrderDiff = Integer.compare( categoryMinOrderMap.get(e1.getCategoryId()), categoryMinOrderMap.get(e2.getCategoryId()) ); if (categoryOrderDiff != 0) { return categoryOrderDiff; } // 第二排序规则:同分类内按自身eventOrder升序排列 return Integer.compare(e1.getEventOrder(), e2.getEventOrder()); });
逻辑说明
该实现完全匹配你的需求:每个分类整体的排序优先级由分类下最早出现(eventOrder最小)的事件决定,保证了eventOrder更小的事件对应的分类整体靠前,同时同分类的事件连续排列、内部按eventOrder升序。用你提供的测试数据运行上述代码,输出结果和你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者kevin Lema
相关产品推荐
相关产品推荐

