1.情景展示
如上图所示,按日期进行数据统计,我们知道,数据的来源肯定是数据库,一旦指定时间段,必然存在日期空缺的情况(也就是当天没有产生数据)
除了使用SQL填补空缺日期记录外,有时我们不得不在java中做处理,填补空缺日期,并造当天的数据(最好还是使用SQL,实在实现不了再用java)
这种情况也很常见,今天我们一起来看下,如何通过java填补空缺的数据,并返回给前端?
2.解决方案
/** * 开票统计(按天统计) */ @GetMapping("czKptJ/days")// /ticket/index/czKptJ/days @ApiOperation("首页开票统计(走势图)") public Result<List<CzKpTjDays>> getczKptJByDays(){ // 当前用户 UserDetailBO currentUser = userHandler.getCurrentUser(); // 查询条件 List<CzKpTjDays> result = czKpTjDaysManager.lambdaQuery() .eq(CzKpTjDays::getOrgCode, currentUser.getOrgcode()) .ge(CzKpTjDays::getKpDate,DateUtils.getForwardTowardDate(-6)) .le(CzKpTjDays::getKpDate,DateUtils.getToday()) .list(); // 不够7天,说明日期存在空缺 if (result.size() < 7) { // Step 1:从查询结果中提取日期 List<LocalDate> resultDateList = new ArrayList<>(result.size()); result.forEach(row ->{ resultDateList.add(row.getKpDate()); }); // Step 2:获取当前时间的前7天时间,共7天 LocalDate[] datesArray = {DateUtils.getForwardTowardDate(-6), DateUtils.getForwardTowardDate(-5), DateUtils.getForwardTowardDate(-4), DateUtils.getForwardTowardDate(-3), DateUtils.getForwardTowardDate(-2), DateUtils.getForwardTowardDate(-1), DateUtils.getToday()}; // Step 3:array-->list List<LocalDate> addDateList = new ArrayList<>(Arrays.asList(datesArray)); // Step 4:将查询结果中的日期排除在外 addDateList.removeAll(resultDateList); // Step 5:准备将要填充的数据 List<CzKpTjDays> addList = new ArrayList<>(addDateList.size()); addDateList.forEach(date -> { addList.add(new CzKpTjDays().setKpDate(date).setFsKpTotal(new BigDecimal(0)).setMzKpTotal(new BigDecimal(0)).setZyKpTotal(new BigDecimal(0)).setOrgCode(currentUser.getOrgcode())); }); // Step 6:添加到原有list中 result.addAll(addList); // Step 7:冒泡排序 for (int i = 0; i < result.size() - 1; i++) { for (int j = 1; j < result.size() - i; j++) { CzKpTjDays czKpTjDays; // 前面的日期大于后面的日期 if ((result.get(j - 1).getKpDate()).isAfter(result.get(j).getKpDate())) { czKpTjDays = result.get(j - 1); // 交换值 result.set((j - 1), result.get(j)); result.set(j, czKpTjDays); } } } } return Results.succ(result); }
不用在意语法问题,关键看思路,难点在于从返回的数据中如何确定缺失的日期。
20200910
关于最后的日期排序,其实可以不用这么复杂,直接利用java8的特性,即可实现升序排列
// 数据按日期升序排列 result.sort(new Comparator<CzKpTjDays>(){ @Override public int compare(CzKpTjDays o1, CzKpTjDays o2) { return o1.getKpDate().compareTo(o2.getKpDate()); } });
List简单版
public static void main(String[] args) { Integer[] numArray = {7,6,5,4,3,2,1}; // Array-->List(泛型必须是封装类) List<Integer> numList = new ArrayList<>(Arrays.asList(numArray)); // 我的list ArrayList<Integer> myList = new ArrayList<>(); myList.add(1); myList.add(5); // 将numList所有元素添加到myList中 myList.addAll(numList); System.out.println("myList集合:" + myList); // 利用set的唯一性特性进行去重 HashSet<Integer> mySet = new HashSet<>(); mySet.addAll(myList); System.out.println("mySet去重:" + mySet); // Set-->ArrayList ArrayList<Integer> newList = new ArrayList<>(); newList.addAll(mySet); System.out.println("去重后的list:" + newList); // 升序排列(要想调用排序方法,必须使用ArrayList) newList.sort(Integer::compareTo); System.out.println("升序排列:" + newList); }