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