记录一次排序(java)

这一次实现一个排序,就是将我们取出来的数据,首先相同公司相同日期的所有数据都要在返回时添加一条小计,然后再处理完所有的数据的时候需要进行一个统计总计,将所有的公司的信息按照时间进行一个统计。

/**
     * 公司的分页
     *
     * @param map
     * @return
     */
    @Override
    public List<Map> queryCompanyPage(Map<String, Object> map) {
        //Page page = new Query(map).getPage();
        List<Map> projectInfoList = this.baseDao.queryCompanyPage(map);
        if(projectInfoList.size()==0){
            return new ArrayList<>();
        }
        Result<List<QltdDeptEntity>> deptresult = qltdDictService.queryDeptList("001001");
        List<QltdDeptEntity> deptEntityList = deptresult.getData();
        List<Map> companyDataList = new ArrayList<>();
        Map<String, Map<String, Object>> dateMap = new HashMap<String, Map<String, Object>>();
        String preCompanyId = "";
        String preDate = "";
        Map<String, Object> dateSumMap = new HashMap<>();
        for (Map<String, Object> projectInfo : projectInfoList) {
            //取得公司名称
            String companyId = (String) projectInfo.get("companyId");
            String dateStr = String.valueOf( projectInfo.get("reportDateTo"));
            String companyName = ReplaceUtils.replaceDept(deptEntityList, companyId);
            projectInfo.put("companyName", companyName);
            // 计算总计
            if (dateMap.containsKey(dateStr)) {
                Map<String, Object> eachDateMap = dateMap.get(dateStr);
                dateMap.put(dateStr, getSumValue(projectInfo, eachDateMap));
            } else {
                Map<String, Object> eachDateMap = new HashMap<String, Object>();
                eachDateMap.putAll(projectInfo);
                eachDateMap.put("companyName", "总计");
                eachDateMap.put("projectName", "");
                eachDateMap.put("projectTypeName", "");
                eachDateMap.put("sumFlg", 1);
                dateMap.put(dateStr, eachDateMap);
            }
            if ("".equals(preCompanyId) && "".equals(preDate)) {
                companyDataList.add(projectInfo);
            } else {
                if (!preDate.equals(dateStr) || !preCompanyId.equals(companyId)) {
                    //公司和日期不同时,计算小计数据
                    companyDataList.add(getPercentValue(dateSumMap));
                    dateSumMap = new HashMap<>();
                }
                companyDataList.add(projectInfo);
            }
            dateSumMap = getSumValue(projectInfo, dateSumMap);
            preCompanyId = String.valueOf(projectInfo.get("companyId"));
            preDate = String.valueOf( projectInfo.get("reportDateTo"));
        }
        //处理最后一条的小计值
        companyDataList.add(getPercentValue(dateSumMap));
        //计算总计的百分比及数据结构转换
        for (Map<String, Object> eachMap : dateMap.values()) {
            companyDataList.add(getPercentValue(eachMap));
        }
        //总计重新排序时间
        List<Map> returnList = new ArrayList();//需要返回
        List<Map> zjList = new ArrayList();//总计
        for (int i = 0; i < companyDataList.size(); i++) {
            Map zjmap = companyDataList.get(i);
            if(zjmap.get("companyName").toString().equals("总计")){
                zjList.add(zjmap);
            }
            else{
                returnList.add(zjmap);
            }
        }
        Map<Date,Map> treeMapDefalut = new TreeMap();
        for (int i = 0; i < zjList.size(); i++) {
            Map zjmap2 = zjList.get(i);
            treeMapDefalut.put((Date) zjmap2.get("reportDateTo"),zjmap2);
        }
        for (Date date : treeMapDefalut.keySet()) {
            returnList.add(treeMapDefalut.get(date));
        }
        //page.setRecords(companyDataList);
        return returnList;
    }

我们来分析一下这段代码,我们首先看一句List projectInfoList = this.baseDao.queryCompanyPage(map);这是实现一个条件查询,将我们查询到的信息才拿出来,然后进行一个判空,如果是查询不到数据化我们就不需要在进行下面的操作了直接返回。
然后就是通过部门的id字典表中数据将数据添加上公司名称这个变量。
我们要实现找到小计的数据,首先在外边定义一个公司id和时间,然后我们再开始拿出一个空的map来,如果这个时间在我们的map没有存储我们就加入map,在map中有这个时间我们就是实现一个数据的求和,这个是在外边写的方法,我这里就没有站出来,因为这并不是我说的重点。
然后我们new出来一个ListcompanyDataList来存放我们的数据,然后我们比较是本条和上一条的公司id和时间是否相同,如果是相同的话就将数据进行相加加在dateSumMap中,如果本条数据和一条数据不相同话就去将一条小计放进我们的companyDataList 中,然后将求和的dateSumMap 置为空,然后在这里有一个问题就是我们会缺少最后一条的小计,因为最后一条的肯定是只有数据,于是我们在外边添加上这一条的小计,然后这里还有一个问题,我们的总计中的数据是存储的键是时间,值是map,我们在展示的是需要按照时间顺序进行展示了,于是我想打了TreeMap,我们将数据存到TreeMap中,他是自带排序的,其实我的这个代码是可以在做优化的,存的时候可以就是直接存在Treemap里面而不用后面再转,不过注意的是TreeMap中得键应该是一个可以比较键,例如int,Integer,double,之类的,时间类型也是可以的因为时间类型可以转换成long类型的数据,于是我们就完成了排序,其实能够完成的方法挺多的但是我还是没有充分掌握。

你可能感兴趣的:(java)