折线图

折线图 

包括数据填充,按周,月均值计算

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;
    }
}

 

转载于:https://www.cnblogs.com/6xiong/p/10879148.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值