ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java统计分析代码编写

2022-04-27 19:31:32  阅读:321  来源: 互联网

标签:统计分析 Java String List private public 柱状图 编写 chartBaseVoList


此处统计分析指的是将数据可视化的方式在前端展示,包括但不限于堆叠柱状图、表格、折线图。返给前端的格式数据比较复杂。前一整子第一次写统计分析,跟前端约定格式的时候让我随便给,然后每个都花了很多时间,每张统计图的格式都有点不同,花费了很多无用功。这次第二次做新的统计分析,明显感觉能把握的住了。对于前后端传递的格式,就直接以ECharts使用的格式完全相同。

ECharts官方所有示例地址

引言

此处可能有一些话引入和一些感谢,以后不起来

各统计图代码示例

动态表格

介绍

动态表格指的是表格的列是不固定的,根据

返回类型定义

点击查看代码
// 最终返回类
@Data
@ToString
public class VO {
    /**
     * 表格数据
     */
    private List<TableChart> tableChartList = new ArrayList<>();
}

// 表格结构
@Data
@ToString
public class TableChart {

    /**
     * 表格的最左边一列
     */
    private String rowTitle;

    /**
     * 所有动态列的数量总数
     */
    private Integer count;

    /**
     * 最大类型名称
     */
    private String maxType;

    /**
     * 最大类型占比
     */
    private String maxProportion;

    /**
     * 排序字段
     */
    private Integer sort;

    /**
     * 动态表格列列表
     */
    private List<TableBase> tableBaseList;
}

// 动态列格式
@Data
@ToString
public class TableBase {

    /**
     * 列名
     */
    private String columnName;

    /**
     * 列值
     */
    private Integer columnValue;

    /**
     * 占比
     */
    private String proportion;
}

// 数据库查询出的数据
@Data
public class ChartBaseVo {

    /**
     * 行名称
     */
    private String abscissa;

    /**
     * 动态列的名称
     */
    private String type;

    /**
     * 值
     */
    private Integer value;
}

构造和填充

点击查看代码
public class Service {
    
    public VO select(Request request) {
        // 行名称
        List<String> lineNameList;
        // 动态列名称
        List<String> columnNameList;
        // 构造表格结构
        List<TableChart> tableChartList = constructTableStructure(lineName, columnNameList);

        // 数据库查询出的数据
        List<ChartBaseVo> chartBaseVoList;
        // 填充表格数据
        fillDataForTable(tableChartList, chartBaseVoList);
        // 表格数据按总数倒序排
        tableChartList.sort(Comparator.comparing(TableChart::getCount).reversed());

     
        // 返回类型
        VO vo = new VO();
        vo.setTableChart(barChart);
        return vo;
    }
    
    /**
     * @description: 表格的多行填充
     * @param tableChartList: 表格数据列表
     * @param chartBaseVoList: 数据库查出的数据
     */
    private void fillDataForTable(List<TableChart> tableChartList, List<ChartBaseVo> chartBaseVoList) {
        for (TableChart table : tableChartList) {
            fillOneDataForTable(table, chartBaseVoList);
        }
    }
    
     /**
     * @description: 表格的单行填充
     * @param table: 单个表格
     * @param chartBaseVoList: 数据库数据
     */
    private void fillOneDataForTable(TableChart table, List<ChartBaseVo> chartBaseVoList) {
        List<ChartBaseVo> tableList = chartBaseVoList.stream().filter(p -> table.getRowTitle().equals(p.getAbscissa())).collect(Collectors.toList());
        Map<String, Integer> chartBaseVoMap = chartBaseVoList.stream().filter(p -> table.getRowTitle().equals(p.getAbscissa())).collect(Collectors.toMap(ChartBaseVo::getType, ChartBaseVo::getValue, (item1, item2) -> item1));

        // 求责任单位处理总数
        int sum = tableList.stream().mapToInt(ChartBaseVo::getValue).sum();
        table.setCount(sum);

        // 数量赋值和求比例
        for (TableBase tableBase : table.getTableBaseList()) {
            Integer value = chartBaseVoMap.get(tableBase.getColumnName());
            value = Objects.nonNull(value) ? value : 0;
            tableBase.setColumnValue(value);
            if (0 == value || 0 == sum) {
                tableBase.setProportion("0%");
            } else {
                tableBase.setProportion(String.format("%.2f", (float) tableBase.getColumnValue() / (float) sum * 100) + '%');
            }
        }
    }
}

柱状图

介绍

据我所知,柱状图的结构大概大差不差,至少普通柱状图和堆叠条形图结构上是一致的,ECharts官网中只是普通柱状图xData和堆叠条形图的yAxis命名上的区别

返回类定义

点击查看代码
// 最终返回类
@Data
@ToString
public class VO {
    /**
     * 柱状图数据
     */
    private BarChart barChart;
}

// 柱状图结构
@Data
@ToString
public class BarChart {

    /**
     * 横坐标轴(横向柱状图时可充当竖向坐标轴)
     */
    private List<String> xData;

    /**
     * 图例条目
     */
    private List<String> legend;

    /**
     * 统计图具体数据
     */
    private List<Series> series;

}

// 统计图一条图例数据
@Data
@ToString
public class Series {

    /**
     * 图例名称
     */
    private String name;

    /**
     * 一条图例的具体数据
     */
    private List<Double> data;
}

// 数据库查询出的数据
@Data
public class ChartBaseVo {

    /**
     * 行名称
     */
    private String abscissa;

    /**
     * 动态列的名称
     */
    private String type;

    /**
     * 值
     */
    private Integer value;
}

构造和填充

点击查看代码
public class Service {
    public VO select(Request request) {
        // 横坐标轴
        List<String> xDataList;
        // 条例名称
        List<String> legendList; 
        // 数据库查询出的数据
        List<ChartBaseVo> chartBaseVoList;
            
        // 构建柱状图    
        BarChart barChart = constructBarTable(xDataList, projectTypeList, chartBaseVoList);    
         
        // 返回类型
        VO vo = new VO();
        vo.setBarChart(barChart);
    }
    
     /**
     * @description: 柱状图数据构建
     * @param xDataList: 横坐标轴数据
     * @param legendList: 柱状图条例分类 (比如一个大数据中心部门对应三个柱子,分别是民生实事、城建工程、重点产业三类)
     * @param chartBaseVoList: 数据库中直接取出的数据,tableChartVoListForBar结构不适合数据读取,故从chartBaseVoList中取数据
     * @return: 柱状图
     */
    private BarChart constructBarTable(List<String> xDataList, List<String> legendList, List<ChartBaseVo> chartBaseVoList) {
        // 柱状图数据赋值
        BarChart barChart = new BarChart();
        barChart.setXData(xDataList);
        barChart.setLegend(legendList);
        List<Series> seriesList = new ArrayList<>();
        for (String legend : legendList) {
            Series series = new Series();
            series.setName(legend);

            // 数据序列
            List<Double> data = new ArrayList<>();
            List<ChartBaseVo> collect = null;
            for (String xData : xDataList) {
                collect = chartBaseVoList.stream().filter(p -> legend.equals(p.getType()) && xData.equals(p.getAbscissa())).collect(Collectors.toList());
            
                if (collect.size() > 0) {
                    data.add(Convert.toDouble(collect.get(0).getValue()) );
                } else {
                    data.add(0d);
                }
            }
            series.setData(data);
            seriesList.add(series);
        }
        barChart.setSeries(seriesList);
        return barChart;
    }
}

标签:统计分析,Java,String,List,private,public,柱状图,编写,chartBaseVoList
来源: https://www.cnblogs.com/hopkin/p/16200236.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有