折线图
包括数据填充,按周,月均值计算
package item.service; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.joda.time.DateTime; import item.domain.DateType; import item.domain.LineData; public class Line { private static final String REAL = "1"; public static void main(String[] args) { Statistics(); } public static void Statistics() { DateTime dateTime = new DateTime(); Date startTime = dateTime.minusDays(30).toDate(); Date endTime = dateTime.plusDays(5).toDate(); DateTime startDateTime = new DateTime(startTime); DateTime endDateTime = new DateTime(endTime); DateType dateType = DateType.DAY; if (DateType.DAY.equals(dateType)) { List<LineData> linDatas = init(); List<LineData> completeDatas = completeDataByDay(linDatas, startTime, endTime); System.out.println(completeDatas); } DateType dateTypeWeek = DateType.WEEK; if (DateType.WEEK.equals(dateTypeWeek)) { // 获取周起始和截止时间 Date realStartDateTime = startDateTime.dayOfWeek() .withMinimumValue().toDate(); Date realEndDateTime = endDateTime.dayOfWeek().withMaximumValue() .toDate(); // 此处查询数据库,带起始和截止时间 List<LineData> linDatas = init(); List<LineData> completeDatas = completeDataByDay(linDatas, realStartDateTime, realEndDateTime); List<LineData> result = new ArrayList<>(); for (int i = 0; i < completeDatas.size(); i += 7) { LineData avg = calculateAvg(completeDatas.subList(i, i + 7)); result.add(avg); } System.out.println(result); } DateType dateTypeMonth = DateType.MONTH; if (DateType.MONTH.equals(dateTypeMonth)) { // 获取月起始和截止时间 Date realStartDateTime = startDateTime.dayOfMonth() .withMinimumValue().toDate(); Date realEndDateTime = endDateTime.dayOfMonth().withMaximumValue() .toDate(); // 获取按月统计横轴数据 List<String> monthXAxis = getmonthXAxis(realStartDateTime, realEndDateTime); System.out.println("monthXAxis" + monthXAxis); List<LineData> linDatas = init(); List<LineData> completeDatas = completeDataByDay(linDatas, realStartDateTime, realEndDateTime); List<LineData> result = new ArrayList<>(); for (String firstDayOfMonth : monthXAxis) { List<LineData> monthLineDatas = new ArrayList<>(); for (LineData data : completeDatas) { if (data.getxAaix() .startsWith(firstDayOfMonth.substring(0, 7))) { monthLineDatas.add(data); } } LineData avg = calculateAvg(monthLineDatas); result.add(avg); } System.out.println(result); } } private static List<String> getmonthXAxis(Date realStartDateTime, Date realEndDateTime) { List<String> result = new ArrayList<>(); DateTime startDateTime = new DateTime(realStartDateTime); DateTime endDateTime = new DateTime(realEndDateTime); DateTime tempTime = startDateTime; while (tempTime.isBefore(endDateTime.plusDays(1))) { result.add(tempTime.toString("yyyy-MM-dd")); tempTime = tempTime.plusMonths(1); } return result; } private static LineData calculateAvg(List<LineData> subList) { int count = 0; BigDecimal total = new BigDecimal(0); for (LineData data : subList) { if (REAL.equals(data.getFlag())) { ++count; total = total.add(new BigDecimal(data.getyAaix())); } } if (0 != count) { return new LineData(subList.get(0).getxAaix(), String.valueOf(total.divide(new BigDecimal(count))), "0"); } else { return new LineData(subList.get(0).getxAaix(), "0", "0"); } } private static List<LineData> completeDataByDay(List<LineData> linDatas, Date startTime, Date endTime) { // 获取以天为维度的横轴数据 List<String> xAaixs = new ArrayList<>(); DateTime startDateTime = new DateTime(startTime); DateTime endDateTime = new DateTime(endTime); DateTime tempTime = startDateTime; while (tempTime.isBefore(endDateTime.plusDays(1))) { // 此处MM是大写的 xAaixs.add(tempTime.toString("yyyy-MM-dd")); tempTime = tempTime.plusDays(1); } System.out.println(xAaixs); // 转换为统计数据结构 Map<String, LineData> LineDataMap = new HashMap<>(); for (LineData data : linDatas) { if (!LineDataMap.containsKey(data.getxAaix())) { LineDataMap.put(data.getxAaix(), data); } } // 补全数据 List<LineData> allLineDatas = new ArrayList<>(); for (String day : xAaixs) { LineData zeroLine = new LineData(day, "0", "0"); allLineDatas.add(null == LineDataMap.get(day) ? zeroLine : LineDataMap.get(day)); } return allLineDatas; } private static List<LineData> init() { List<LineData> result = new ArrayList<>(); LineData data1 = new LineData("2019-05-16", "25.5", "1"); LineData data2 = new LineData("2019-05-18", "30.0", "1"); LineData data3 = new LineData("2019-05-21", "50.0", "1"); LineData data4 = new LineData("2019-05-22", "10.0", "1"); result.add(data1); result.add(data2); result.add(data3); result.add(data4); return result; } }