结果集分组排序功能探索

项目场景:

前台导出Excel数据,需要根据各省份自己问题数进行排序,还要根据各省份问题总数降序排列;


问题描述

根据各省份自己问题数进行排序SQL可以实现,使用group by 和order by即可。
根据各省份问题总数降序排列SQL无法实现(自己没写出来)需要后台处理;


解决思路:

1、把返回的结果集(list)根据省份分成不同的集合;
2、分别计算各省份的问题总数,并把总数作为key放到TreeMap中(jdk内置的java.util包下的TreeMap<K,V>既可满足此类需求,向其构造方法 TreeMap(Comparator<? super K> comparator) 传入我们自定义的比较器即可实现按键排序。)
3、使用TreeMap对结果集进行排序

1、把返回的结果集(list)根据省份分成不同的集合;

//自己项目查询代码
Page<Fwdygzbhg> fwdygzbhgPage = fwdygzbhgBLO.queryFwdygzbhgMx(fwdygzbhgQuery);

for (int i = 0; i < result.getFwdygzbhgDTOList().size(); i++) {
            if (result.getFwdygzbhgDTOList().get(i).getAaf018().equals("660000")) {
                btList.add(result.getFwdygzbhgDTOList().get(i));
            }
            if (result.getFwdygzbhgDTOList().get(i).getAaf018().equals("650000")) {
                xjList.add(result.getFwdygzbhgDTOList().get(i));
            }
            if (result.getFwdygzbhgDTOList().get(i).getAaf018().equals("110000")) {
                bjList.add(result.getFwdygzbhgDTOList().get(i));
            }
           // ……多个省份
  }

2、分别计算各省份的问题总数,并把总数作为key放到TreeMap中

Map<Integer, List<FwdygzbhgDTO>> groups = new TreeMap<>();
List<FwdygzbhgDTO> btList = new ArrayList<>();

if (CollectionUtils.isNotEmpty(btList)) {
            int sum = 0;
            for (FwdygzbhgDTO dto : btList) {
                sum += dto.getZs();
            }
            groups.put(sum, btList);
        }
 ……多个省份       

3、使用TreeMap对结果集进行排序

//按Key进行排序
        Map<Integer, List<FwdygzbhgDTO>> resultMap = sortMapByKey(groups);
        if (resultMap != null && !resultMap.isEmpty()) {
            List<FwdygzbhgDTO> listDto = new ArrayList<>();
            sortResult.setFwdygzbhgDTOList(listDto);
            for (List<FwdygzbhgDTO> fwdygzbhgDTOS : resultMap.values()) {
                sortResult.getFwdygzbhgDTOList().addAll(fwdygzbhgDTOS);
            }
        }

4、排序方法

	public static Map<Integer, List<FwdygzbhgDTO>> sortMapByKey(Map<Integer, List<FwdygzbhgDTO>> map) {
        if (map == null || map.isEmpty()) {
            return null;
        }
        Map<Integer, List<FwdygzbhgDTO>> sortMap = new TreeMap<>(
                new MapKeyComparator());
        sortMap.putAll(map);
        return sortMap;
    }

    static class MapKeyComparator implements Comparator<Integer> {
        @Override
        public int compare(Integer str1, Integer str2) {
			//升序只使用str1.compareTo(str2),本需求需要降序
            return str2.compareTo(str1);
        }
    }

最后来个结果页面展示,即实现了省份自己的问题数降序,也实现了不同省份问题数总和的降序
在这里插入图片描述

本内容只是自己项目需求解决思路,因实力有限,实现可能不够完美,欢迎大家提出优化建议。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值