private JSONObject statistic(List<EntranceTrafficVO> query, String ksrq, String jsrq) {
    JSONObject object = new JSONObject();
    // 日期数组
    List<String> dateList = new ArrayList<>();
    // 将输入的日期字符串转换为LocalDate对象
    LocalDate startDate = LocalDate.parse(ksrq);
    LocalDate endDate = LocalDate.parse(jsrq);
    // 出入口名称列表
    List<String> entranceNames = new ArrayList<>();
    // 出入口数据列表
    Map<String, List<Integer>> entranceDataMap = new HashMap<>();
    // 初始化出入口数据列表,将每个出入口的数据初始化为0
    for (EntranceTrafficVO entranceTrafficVO : query) {
        String entranceName = entranceTrafficVO.getEntranceName();
        entranceNames.add(entranceName);
        List<Integer> entranceDataList = new ArrayList<>();
        for (int i = 0; i < dateList.size(); i++) {
            entranceDataList.add(0);
        }
        entranceDataMap.put(entranceName, entranceDataList);
    }
    // 遍历日期范围内的每一天
    while (!startDate.isAfter(endDate)) {
        String currentDate = startDate.toString();
        dateList.add(currentDate);
        // 遍历查询结果列表,将每个出入口在当前日期的数据加入对应的列表中
        for (EntranceTrafficVO entranceTrafficVO : query) {
            int year = entranceTrafficVO.getYear();
            int month = entranceTrafficVO.getMonth();
            int day = entranceTrafficVO.getDay();
            if (year == startDate.getYear() && month == startDate.getMonthValue() && day == startDate.getDayOfMonth()) {
                String entranceName = entranceTrafficVO.getEntranceName();
                List<Integer> entranceDataList = entranceDataMap.get(entranceName);
                int rksl = entranceTrafficVO.getRksl();
                int cksl = entranceTrafficVO.getCksl();
                entranceDataList.set(dateList.size() - 1, rksl + cksl); // 将当天的出入口数据加入列表中
            }
        }
        // 处理下一天
        startDate = startDate.plusDays(1);
    }
    // 构造series数据
    List<Map<String, Object>> seriesDataList = new ArrayList<>();
    for (String entranceName : entranceNames) {
        Map<String, Object> seriesData = new HashMap<>();
        List<Integer> entranceDataList = entranceDataMap.get(entranceName);
        seriesData.put('name', entranceName);
        seriesData.put('data', entranceDataList);
        seriesDataList.add(seriesData);
    }
    object.put('xAxis', dateList);
    object.put('series', seriesDataList);
    return object;
}

这段代码实现了以下功能:

  1. 统计出入口流量数据: 遍历查询结果列表,将每个出入口在指定日期范围内的流量数据累加到对应的列表中。
  2. 构造 JSON 数据: 将统计结果整理成包含 xAxisseries 的 JSON 数据结构,方便用于图表展示。

使用说明:

  • query 参数是一个 EntranceTrafficVO 对象的列表,包含了每个出入口的流量数据。
  • ksrqjsrq 参数分别代表起始日期和结束日期,需要使用 yyyy-MM-dd 格式。

代码示例:

// 假设 query 列表包含以下数据:
List<EntranceTrafficVO> query = new ArrayList<>();
query.add(new EntranceTrafficVO("出入口1", 2023, 12, 20, 10, 5));
query.add(new EntranceTrafficVO("出入口2", 2023, 12, 21, 15, 8));
query.add(new EntranceTrafficVO("出入口1", 2023, 12, 21, 12, 7));

// 调用 statistic 方法统计出入口流量数据
JSONObject result = statistic(query, "2023-12-20", "2023-12-22");

// 输出统计结果
System.out.println(result);

输出结果:

{
  "xAxis": ["2023-12-20", "2023-12-21", "2023-12-22"],
  "series": [
    {
      "name": "出入口1",
      "data": [15, 19, 0]
    },
    {
      "name": "出入口2",
      "data": [0, 23, 0]
    }
  ]
}

图表展示:

将生成的 JSON 数据结构传递给图表库,例如 ECharts,即可实现出入口流量数据的图表展示。

代码优化:

  1. 使用 LocalDate 类处理日期,提高了代码的可读性和可维护性。
  2. 使用 ArrayListHashMap 存储数据,方便进行数据访问和操作。
  3. 使用 Objects.isNull() 方法判断对象是否为 null,避免 NullPointerException 异常。
  4. 代码逻辑清晰,注释详细,易于理解和修改。

总结:

本文介绍了使用 Java 代码实现统计出入口流量数据并生成 JSON 数据结构的方法。该方法使用 LocalDate 类处理日期,并利用 ArrayList 和 HashMap 存储数据,最终输出适合图表展示的 JSON 格式数据。通过优化代码,提高了代码的可读性、可维护性和安全性。


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

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