java实现分组排序

方案1 使用单个Comparator实现

/**
 * 使用单个比较器进行多字段排序
 * @param medalList
 * @return
 */
public  static List<String> rankBySingleComparator(List<Medal> medalList){
    Collections.sort(medalList,(medal1,medal2)->{
        //第一排序字段
        if(medal1.getGi()!=medal2.getGi()){
            return medal2.getGi()-medal1.getGi(); //若要正序,交互medal1和medal2的位置即可
        }
        //第二排序字段
        if(medal1.getSi()!=medal2.getSi()){
            return medal2.getSi()-medal1.getSi(); //若要正序,交互medal1和medal2的位置即可
        }
        //第三排序字段
        if(medal1.getBi()!=medal2.getBi()){
            return medal2.getBi()-medal1.getBi(); //若要正序,交互medal1和medal2的位置即可
        }
        //第四排序字段
       return medal1.getCountry().compareTo(medal1.getCountry()); //若要倒序,交互medal1和medal2的位置即可
    });
    return medalList.stream().map(Medal::getCountry).collect(Collectors.toList());
}

方案2 使用stream实现

/**
     * 使用Stream进行多字段排序
     *
     * @param medalList
     * @return
     */
    public static List<String> rankByStream(List<Medal> medalList) {
        return medalList.stream().sorted(Comparator.comparing(Medal::getGi, Comparator.reverseOrder())
                .thenComparing(Medal::getSi, Comparator.reverseOrder().reversed())
                .thenComparing(Medal::getBi, Comparator.reverseOrder())
                .thenComparing(Medal::getCountry)).map(Medal::getCountry).collect(Collectors.toList());
    }

lambda 实现排序
list.sort((o1, o2) -> o2.getCreateTime().compareTo(o1.getCreateTime()));

分组排序

  // 分组
        Map<String, List<AreaInfoListVo>> collect = vos.stream().collect(Collectors.groupingBy(t -> t.getYear()));
        Set<String> keySets = collect.keySet();
        log.info(keySets.toString());
        //排序取 前 limit
        for (Iterator iterator = keySets.iterator(); iterator.hasNext(); ) {
            String year = (String) iterator.next();
            List<AreaInfoListVo> collect1 = collect.get(year).stream()
                    .sorted(Comparator
                            .comparing(AreaInfoListVo::getYear, Comparator.reverseOrder()))
                    .collect(Collectors.toList()).subList(0,req.getLimit());
            log.info(collect1.toString());
            System.out.println(year);
        }
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值