Java 自动补全日期 EChartst折线图数据处理

本文介绍了一种在Java中使用ECharts创建折线图时,如何解决因数据缺失导致图表显示不完整的问题。通过代码实现,对原始数据进行处理,自动补全缺失日期的数据点,确保图表展示的连续性和准确性。

Java 自动补全日期 EChartst折线图数据处理

业务需求

需要echarts做一个折线图,查询出结果后放到图中发现没有数据的日期并没有那天的数据,图有点不搭。

开始找解决办法,从sql上解决,找了很多之后发现大同小异都是需要建表来关联查询。

那就换种办法,从代码上解决吧。

解决办法

一开始的数据是这样的

[
    {
        "date": "2018-03-26",
        "count": 0,
        "id": null
    },
    {
        "date": "2018-03-29",
        "count": 0,
        "id": null
    },
    {
        "date": "2018-03-30",
        "count": 1,
        "id": null
    },
    {
        "date": "2018-03-31",
        "count": 2,
        "id": null
    }
]

自己定义了list将日期取出,开始补全日期。

写了个方法方便自己调用,list为日期list。begin将开始的日期传入,daySub为开始到结束日期之间的总天数,返回的是补全后的日期。

public static List<String> completionDate(List<String> list ,String begin , int daySub){
  ArrayList<String> dateResult = new ArrayList<String>();
  //时间增加一天
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  Calendar yesterday = Calendar.getInstance();
  yesterday.add(Calendar.DAY_OF_MONTH, 1);
  String dateStr = sdf.format(yesterday.getTime());
  
  //日期比较(求差多少天),时间也可以比较
  Calendar now = Calendar.getInstance();

  //字符串转化为时间
  Calendar calendar10 = Calendar.getInstance();
  Calendar calendar5 = Calendar.getInstance();
  //循环处理日期数据,把缺失的日期补全。10是时间段内的天数,5是要处理的日期集合的天数
  try {
       Date date = sdf.parse(begin);
       calendar10.setTime(date);
  } catch (ParseException e) {
      e.printStackTrace();
  }
  for(int curr = 0 ; curr < daySub ; curr++){
      
      boolean dbDataExist = false;
      int index = 0;
      for(int i  = 0 ; i < list.size() ; i++){
          try {
              Date date2 = sdf.parse(list.get(i));
              calendar5.setTime(date2);
          } catch (ParseException e) {
              e.printStackTrace();
          }
          if(calendar10.compareTo(calendar5) == 0){
              dbDataExist  = true;
              index = i;
              break;
          }
      }
      if(dbDataExist){
          dateResult.add(list.get(index));
      }else{
          dateResult.add(sdf.format(calendar10.getTime()));
      }
      //还原calendar10
      calendar10.add(Calendar.DAY_OF_MONTH, 1 );
  }
      
  return dateResult;
}

补全的日期list到手,接下来要将原来不存在的日期的数值补充为0。实现也很简单。

先定义map将原来的日期和值放进去,得到新的补全后list后遍历通过map取值,如果为空就是添加的日期,将value赋值为0,最后返回新的集合就行。

Java中,当你需要在DTO层(Data Transfer Object,数据传输对象)传递起始年份作为参数,并在VO(Value Object,值对象)中返回年份和对应的金额时,可以这样做: 1. DTO层(例如`AnnualStartDto.java`): ```java public class AnnualStartDto { private int year; // 起始年份,如果没有自动补全功能,默认为当前年份 public AnnualStartDto() { this.year = Calendar.getInstance().get(Calendar.YEAR); // 如果不需要用户输入,可以用当前年份初始化 } // getters and setters } ``` 2. VO层(例如`FinancialReportVo.java`): ```java public class FinancialReportVo { private int year; private double amount; // 构造函数接收年度和金额 public FinancialReportVo(int year, double amount) { this.year = year; this.amount = amount; } // getters and setters } ``` 3. 对于日期处理,Java提供`java.time.LocalDate`或`java.util.Calendar`,你可以创建方法来填充完整年份: ```java private LocalDate fillYear(int yearInput) { return yearInput == 0 ? LocalDate.now() : LocalDate.of(yearInput, 1, 1); } // 使用这个方法在VO构造时 FinancialReportVo report = new FinancialReportVo(fillYear(startYearDto.getYear()), startYearDto.getAmount()); ``` 4. ECharts折线图数据处理: ```java List<FinancialReportVo> dataSeries = ... // 填充VO列表 Map<String, List<Data>> seriesData = new HashMap<>(); for (FinancialReportVo vo : dataSeries) { seriesData.put("年份", Collections.singletonList(new Data(vo.getYear(), vo.getAmount()))); } ``` 5. ServiceImpl层(例如`FinancialService.java`): ```java @Service public class FinancialServiceImpl implements FinancialService { @Override public void processData(List<AnnualStartDto> inputs) { for (AnnualStartDto dto : inputs) { FinancialReportVo vo = new FinancialReportVo(dto.getYear(), calculateAmount(dto.getYear())); // 将VO添加到图表数据列表 } // 绘制ECharts折线图 } // 根据起始年份计算金额的逻辑... private double calculateAmount(int year) { // ... } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值