在最近一次项目开发中,需要对List< HashMap>做排序,在做的过程中,发现与 List<类>的编写方法不一样,记录一下。
首先说一下项目背景,需要做一个排行榜功能,排序字段rank1,rank2,rank1是bigdecimal类型数字,rank2是汉字。
需要做排序的是一个List< HashMap>,需要对rank1降序,rank2升序排序后并补充名次。
介绍下我的编写过程。
- 最一开始时,没注意还需要对rank2排序,就只对rank1做了排序,和List<类> 差不多
List<HashMap> collect = list.stream().sorted(Comparator.comparing(map -> MathUtils.getBigDecimal((Map)map.get(rank1)),Comparator.reverseOrder()))
.collect(Collectors.toList());
List<类>的
List<类> collect = list.stream().sorted(Comparator.comparing(类::属性一).reversed()).collect(Collectors.toList());
// 或者
List<类> collect = list.stream().sorted(Comparator.comparing(类::属性一,Comparator.reverseOrder())).collect(Collectors.toList());
- 发现还需要对第二个字段做排序后,很自然地想到在后面直接加 thenComparing
// 注意,这里会报错
// 如果是 List<类> 是可以直接加的
List<HashMap> collect = list.stream().sorted(Comparator.comparing(map -> MathUtils.getBigDecimal((Map)map.get(rank1)),Comparator.reverseOrder()).thenComparing(map -> map.get(rank2).toString())).collect(Collectors.toList());
报错如下
3. 既然放在一块时,hashmap读取出错,那就分开写试试,问题解决
// 对rank1降序
Comparator<HashMap> comparatorRank1 = Comparator.comparing( map -> MathUtils.getBigDecimal( map.get(rank1)), Comparator.reverseOrder());
// 对rank2升序
Comparator<HashMap> comparatorRank2 = Comparator.comparing( map -> map.get(rank2).toString());
// 对List排序
list.sort(comparatorRank1.thenComparing(comparatorRank2));
- 新的问题,要求的是对rank2按首字母升序排序,由于rank2 是汉字,直接排序会失败(不报错)。需要指定一下 语言环境。
// 排序
Comparator<HashMap> comparatorRank1 = Comparator.comparing( map -> MathUtils.getBigDecimal( map.get(rank1)), Comparator.reverseOrder());
// 指定语言环境为中文
Collator collator = Collator.getInstance(java.util.Locale.CHINA);
Comparator<HashMap> comparatorRank2 = Comparator.comparing( map -> map.get(rank2).toString(),collator);
list.sort(comparatorRank1.thenComparing(comparatorRank2));
到此排序完成。
Life is fantastic