中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java自動生成趨勢比對數據的方法是什么

發布時間:2023-04-07 15:44:24 來源:億速云 閱讀:136 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“Java自動生成趨勢比對數據的方法是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“Java自動生成趨勢比對數據的方法是什么”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

背景

數據之間兩兩趨勢比較在數據分析應用中是非常常見的應用場景,如下所示:

模擬考批次班級學生語文數學英語
202302三年一班張小明130145133
202302三年一班王二小128138140
202302三年一班謝春花136142139
202301三年一班張小明132140128
202301三年一班王二小125146142
202301三年一班謝春花138143140
202212三年一班張小明135138120
202212三年一班王二小123145138
202212三年一班謝春花136140142

現在有一個需求:各班級的每個學生在不同考試批次的各學科成績的進退步情況,得出數據如下

模擬考批次班級學生語文數學英語
202302與202301對比三年一班張小明-255
202302與202301對比三年一班王二小3-8-2
202302與202301對比三年一班謝春花-2-1-1
202301與202212對比三年一班張小明-328
202301與202212對比三年一班王二小214
202301與202212對比三年一班謝春花23-2

詳細設計及實現

趨勢比對定義類 TrendCompare

public class TrendCompare {
    /**
     * 主體的字段列表(如三年一班的張小明,那么主體字段列表為 班級 + 學生姓名)
     */
    private String[] subjectFields;
    /**
     * 在某個字段的(介詞) 如三年一班張曉明在不同考試批次的成績對比結果
     */
    private String atField;

    /**
     * 參與趨勢比較的字段集合
     */
    private String[] compareFields;

    /**
     * 賦值映射集合:給結果數據中指定的key設置指定的值
     */
    private Map<String, String> assignValMap;

    public String[] subjectFields() {
        return this.subjectFields;
    }

    public TrendCompare subjectFields(String... fields) {
        this.subjectFields = fields;
        return this;
    }

    public String atField() {
        return this.atField;
    }

    public TrendCompare atField(String field) {
        this.atField = field;
        return this;
    }

    public String[] compareFields() {
        return this.compareFields;
    }

    public TrendCompare compareFields(String... fields) {
        this.compareFields = fields;
        return this;
    }

    /**
     * 賦值操作
     *
     * @param field
     * @param valueEL 值表達式
     * @return
     */
    public TrendCompare assignVal(String field, String valueEL) {
        if (assignValMap == null) {
            assignValMap = new HashMap<>();
        }
        assignValMap.put(field, valueEL);
        return this;
    }

    public Map<String, String> assignValMap() {
        return this.assignValMap;
    }
}

該類定義了如下屬性:

  • 主體的字段列表

  • 介詞字段

  • 比對的字段列表

如:各班級的每個學生在不同考試批次各學科成績的進退步情況

上面的需求映射到定義類的結果如下:

  • 主體的字段列表(班級、學生

  • 介詞字段(考試批次

  • 比對的字段列表(各學科:語文、數學、英語

趨勢比對執行類

該類提供了一個供外部調用的方法如下

public static <T> List<T> compare(List<T> dataList, TrendCompare trendCompare) {
    Map<String, List<T>> groupMap = group(dataList, null, trendCompare.subjectFields());
    List<T> resultList = new ArrayList<>();
    for (List<T> groupDataList : groupMap.values()) {
        List<T> diffValueList = new ArrayList<>();
        int size = groupDataList.size();
        if (size > 1) {
            for (int i = 0; i < size - 1; i++) {
                //數據之間兩兩比較 diffValue = minuend - subtrahend
                T minuend = groupDataList.get(i);
                T subtrahend = groupDataList.get(i + 1);
                T diffValue = minus(trendCompare.compareFields(), minuend, subtrahend);
                //設置主體信息
                if (trendCompare.subjectFields() != null) {
                    for (String subjectField : trendCompare.subjectFields()) {
                        setFieldValue(diffValue, subjectField, getFieldValue(minuend, subjectField));
                    }
                }
                //設置介詞字段信息
                String atField = trendCompare.atField();
                if (StringUtils.isNotEmpty(atField)) {
                    setFieldValue(diffValue, atField, getFieldValue(minuend, atField) + "與" + getFieldValue(subtrahend, atField) + "對比增減");
                }
                diffValueList.add(diffValue);
            }
        }
        if (diffValueList.size() > 0) {
            T firstData = groupDataList.get(0);
            Map<String, Object> valMap = new HashMap<>();
            //指定的賦值集合進行賦值
            if (trendCompare.assignValMap() != null) {
                for (Map.Entry<String, String> stringStringEntry : trendCompare.assignValMap().entrySet()) {
                    String field = stringStringEntry.getKey();
                    if (!StringUtils.equalsAny(field, trendCompare.compareFields())) {
                        String valueEL = stringStringEntry.getValue();
                        valMap.put(field, executeSpEL(valueEL, firstData));
                    }
                }
            }
            for (Map.Entry<String, Object> entry : valMap.entrySet()) {
                for (T diffValue : diffValueList) {
                    setFieldValue(diffValue, entry.getKey(), entry.getValue());
                }
            }
        }
        resultList.addAll(diffValueList);
    }
    return resultList;
}

可以看到,該方法要求傳入

  • 數據集合

  • 趨勢比對定義

兩個參數,并最終返回趨勢比對后的結果集合。

該方法的內部邏輯可分為如下2個步驟:

  • 按主體分組

  • 分組后組內數據兩兩比對,并最終返回比對結果。

使用案例

假設有如下這樣一組數據

Java自動生成趨勢比對數據的方法是什么

定義一個學生類:

public class Student {
    private String batch;
    private String banji;
    private String studentNo;
    private String name;
    private String sex;
    private Double yuwen;
    private Double math;
    private Double english;
    private Double physics;
    //extra
    private String maxScoreName1;
    public Student(String batch, String banji, String studentNo, String name, String sex, Double yuwen, Double math, Double english, Double physics) {
        this.batch = batch;
        this.banji = banji;
        this.studentNo = studentNo;
        this.name = name;
        this.sex = sex;
        this.yuwen = yuwen;
        this.math = math;
        this.english = english;
        this.physics = physics;
    }
}

我們寫一個方法,返回如上數據:

public List<Student> getDataList() {
    List<Student> dataList = new ArrayList<>();
    dataList.add(new Student("202302", "三年一班", "20001001", "張小明", "男", 130.0, 145.0, 133.0, 92.0));
    dataList.add(new Student("202302", "三年一班", "20001002", "王二小", "男", 128.0, 138.0, 140.0, 98.0));
    dataList.add(new Student("202302", "三年一班", "20001003", "謝春花", "女", 136.0, 142.0, 139.0, 95.0));
    dataList.add(new Student("202302", "三年二班", "20002001", "馮世杰", "男", 129.0, 144.0, 138.0, 96.0));
    dataList.add(new Student("202302", "三年二班", "20002002", "馬功成", "男", 130.0, 132.0, 133.0, 98.0));
    dataList.add(new Student("202302", "三年二班", "20002003", "魏翩翩", "女", 136.0, 142.0, 137.0, 92.0));
    dataList.add(new Student("202301", "三年一班", "20001001", "張小明", "男", 132.0, 142.0, 134.0, 92.0));
    dataList.add(new Student("202301", "三年一班", "20001002", "王二小", "男", 126.0, 136.0, 135.0, 94.0));
    dataList.add(new Student("202301", "三年一班", "20001003", "謝春花", "女", 136.0, 145.0, 139.0, 95.0));
    dataList.add(new Student("202301", "三年二班", "20002001", "馮世杰", "男", 124.0, 143.0, 148.0, 90.0));
    dataList.add(new Student("202301", "三年二班", "20002002", "馬功成", "男", 140.0, 133.0, 138.0, 90.0));
    dataList.add(new Student("202301", "三年二班", "20002003", "魏翩翩", "女", 126.0, 136.0, 135.0, 92.0));
    return dataList;
}

趨勢比對定義并執行比對:

List<Student> dataList = getDataList();
TrendCompare trendCompare = new TrendCompare()
        .subjectFields("banji", "name")
        .atField("batch")
        .compareFields("yuwen", "math", "english")
        //.assignVal("batch", "'環比增減'")
        ;
List<Student> resultList = DataProcessUtil.compare(dataList, trendCompare);
for (Student result : resultList) {
    System.out.println(JSON.toJSONString(result));
}

結果如下:

{"banji":"三年一班","batch":"202302與202301對比增減","english":-1.0,"math":3.0,"name":"張小明","yuwen":-2.0}
{"banji":"三年一班","batch":"202302與202301對比增減","english":5.0,"math":2.0,"name":"王二小","yuwen":2.0}
{"banji":"三年一班","batch":"202302與202301對比增減","english":0.0,"math":-3.0,"name":"謝春花","yuwen":0.0}
{"banji":"三年二班","batch":"202302與202301對比增減","english":-10.0,"math":1.0,"name":"馮世杰","yuwen":5.0}
{"banji":"三年二班","batch":"202302與202301對比增減","english":-5.0,"math":-1.0,"name":"馬功成","yuwen":-10.0}
{"banji":"三年二班","batch":"202302與202301對比增減","english":2.0,"math":6.0,"name":"魏翩翩","yuwen":10.0}

讀到這里,這篇“Java自動生成趨勢比對數據的方法是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

禄丰县| 杨浦区| 金乡县| 井冈山市| 延津县| 琼海市| 十堰市| 商河县| 新巴尔虎右旗| 徐州市| 扶风县| 桂阳县| 绥中县| 望谟县| 化隆| 太和县| 察雅县| 翁源县| 高邑县| 无棣县| 楚雄市| 汾阳市| 洪洞县| 临邑县| 南昌市| 郧西县| 罗田县| 民县| 博罗县| 象州县| 万州区| 拉萨市| 铜梁县| 瑞昌市| 天津市| 铁岭县| 谢通门县| 泌阳县| 鄂尔多斯市| 滁州市| 隆子县|