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);
        }

猜你喜欢

转载自blog.csdn.net/L_994572281_LYA/article/details/120034562