private JSONObject statistic(List<EntranceTrafficVO> query, String ksrq, String jsrq) {
    JSONObject object = new JSONObject();
    // 日期数组
    List<String> dateList = new ArrayList<>();
    // 出入口数据数组
    List<Map<String, Object>> seriesList = new ArrayList<>();
    // 出入口名称数组
    List<String> entranceList = new ArrayList<>();
    // 将输入的日期字符串转换为LocalDate对象
    LocalDate startDate = LocalDate.parse(ksrq);
    LocalDate endDate = LocalDate.parse(jsrq);
    // 遍历日期范围内的每一天
    while (!startDate.isAfter(endDate)) {
        String currentDate = startDate.toString();
        dateList.add(currentDate);
        // 遍历出入口数据
        for (EntranceTrafficVO entranceTrafficVO : query) {
            // 如果出入口数据日期为空,则跳过
            if (Objects.isNull(entranceTrafficVO.getYear()) || Objects.isNull(entranceTrafficVO.getMonth()) || Objects.isNull(entranceTrafficVO.getDay())) {
                continue;
            }
            // 如果出入口数据日期与当前日期相同,则将数据添加到对应的出入口数据数组
            if (startDate.getYear() == entranceTrafficVO.getYear() && startDate.getMonthValue() == entranceTrafficVO.getMonth() && startDate.getDayOfMonth() == entranceTrafficVO.getDay()) {
                // 获取当前出入口名称
                String entranceName = entranceTrafficVO.getEntranceName();
                // 如果当前出入口名称不存在于出入口名称数组中,则添加到数组中
                if (!entranceList.contains(entranceName)) {
                    entranceList.add(entranceName);
                }
                // 遍历出入口数据数组,找到对应的出入口数据,并将当前日期的入口流量和出口流量添加到对应数组中
                for (Map<String, Object> series : seriesList) {
                    if (series.get('name').equals(entranceName)) {
                        List<Integer> rkList = (List<Integer>) series.get('dataRk');
                        List<Integer> ckList = (List<Integer>) series.get('dataCk');
                        rkList.add(entranceTrafficVO.getRksl());
                        ckList.add(entranceTrafficVO.getCksl());
                        break;
                    }
                }
                // 如果当前出入口数据数组不存在,则创建一个新的出入口数据数组,并将当前日期的入口流量和出口流量添加到对应数组中
                Map<String, Object> seriesMap = new HashMap<>();
                List<Integer> rkList = new ArrayList<>();
                List<Integer> ckList = new ArrayList<>();
                rkList.add(entranceTrafficVO.getRksl());
                ckList.add(entranceTrafficVO.getCksl());
                seriesMap.put('name', entranceName);
                seriesMap.put('dataRk', rkList);
                seriesMap.put('dataCk', ckList);
                seriesList.add(seriesMap);
            }
        }
        // 处理下一天
        startDate = startDate.plusDays(1);
    }
    // 根据出入口名称数组,创建对应的出入口数据数组
    List<Map<String, Object>> yList = new ArrayList<>();
    for (String entranceName : entranceList) {
        Map<String, Object> seriesMap = new HashMap<>();
        List<Integer> rkList = new ArrayList<>();
        List<Integer> ckList = new ArrayList<>();
        seriesMap.put('name', entranceName);
        for (Map<String, Object> series : seriesList) {
            if (series.get('name').equals(entranceName)) {
                rkList.addAll((List<Integer>) series.get('dataRk'));
                ckList.addAll((List<Integer>) series.get('dataCk'));
                break;
            }
        }
        seriesMap.put('dataRk', rkList);
        seriesMap.put('dataCk', ckList);
        yList.add(seriesMap);
    }
    object.put('xAxis', dateList);
    object.put('series', yList);
    return object;
}

该代码将出入口流量数据按照日期和出入口名称进行分组,并生成符合 Echarts 或 Highcharts 等图表库要求的 JSON 数据格式。

代码主要步骤如下:

  1. 定义数据结构: 定义了三个 List 用于存储数据:dateList 存储日期、seriesList 存储出入口数据、entranceList 存储出入口名称。
  2. 遍历日期范围: 遍历开始日期到结束日期之间的每一天。
  3. 遍历出入口数据: 遍历出入口数据列表,找出与当前日期匹配的出入口数据。
  4. 创建出入口数据数组: 如果当前出入口名称不存在于 entranceList 中,则将其添加到 entranceList 中,并创建一个新的出入口数据数组,将当前日期的流量数据添加到数组中。
  5. 将数据整合到 yList: 遍历 entranceList 中的每个出入口名称,从 seriesList 中找到对应的出入口数据,并将所有日期的流量数据整合到一个数组中。
  6. 生成 JSON 数据: 将 dateList 作为 xAxis 数据,将 yList 作为 series 数据,组合成 JSON 数据格式。

通过以上步骤,即可将出入口流量数据转化成可用于图表展示的 JSON 数据格式。

Java 代码实现统计出入口流量数据并生成图表

原文地址: https://www.cveoy.top/t/topic/oZOu 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录