Map根据Key值进行排序
如果这篇文章对你有帮助的话,希望可以给博主点个赞,感谢!!
今天在写一个功能的时候,需要根据日期进行分组,于是我从数据库查找的时候就使用order by create_time desc
进行降序排序,一开始数据是正常的排序,但是当我使用stream()
进行分组之后,发现数据排序出现了问题
首先根据日期进行分组,日期作为Map的key,对应该日期的数据列表作为value进行存储,但是可以从图看出这个日期并不是降序的,这会导致前端获取到这些数据的时候无法按照正确的顺序输出。
所以我们要对这个listMap进行再一次排序。
List<EarnDetailParam> list=cereShopOrderDAO.getEarnDetails(param);
list.stream().forEach(l->l.setDate(l.getCreateTime().split(" ")[0]));
Map<String,List<EarnDetailParam>> listMap = list.stream().collect(Collectors.groupingBy(EarnDetailParam::getDate));
Map<String, List<EarnDetailParam>> result = new LinkedHashMap<>();
listMap.entrySet().stream().sorted(Collections.reverseOrder(Map.Entry.comparingByKey())).forEachOrdered(x -> result.put(x.getKey(), x.getValue()));
首先我们根据第一条语句去数据库获取数据,由于create_time
是带有时间的,所以分组的时候需要一个新的变量去存create_time
切割后的日期
list.stream().collect(Collectors.groupingBy(EarnDetailParam::getDate))
这个语句是使用刚刚获取的date进行分组操作,之后就会得到上面的图。
由于顺序不是我们所希望的降序,所以我们还需要进行下一步操作,定义一个LinkedHashMap
进行存储,然后根据Map的Key进行排序,因为我们要的是降序操作,所以要在.sorted(Collections.reverseOrder(Map.Entry.comparingByKey()))
使用reverseOrder
进行逆序,然后将键值对赋给result
.sorted(Map.Entry.comparingByKey())
是升序
.sorted(Collections.reverseOrder(Map.Entry.comparingByKey()))
是逆序
此时就会得到我们所需要的降序分组,实现了我们想要的效果。