Rumah  >  Artikel  >  Java  >  Apakah kaedah untuk Java menjana data perbandingan trend secara automatik?

Apakah kaedah untuk Java menjana data perbandingan trend secara automatik?

王林
王林ke hadapan
2023-05-03 09:37:06899semak imbas

Latar Belakang

Perbandingan arah aliran berpasangan antara data ialah senario aplikasi yang sangat biasa dalam aplikasi analisis data, seperti yang ditunjukkan di bawah:

模拟考批次 班级 学生 语文 数学 英语
202302 三年一班 张小明 130 145 133
202302 三年一班 王二小 128 138 140
202302 三年一班 谢春花 136 142 139
202301 三年一班 张小明 132 140 128
202301 三年一班 王二小 125 146 142
202301 三年一班 谢春花 138 143 140
202212 三年一班 张小明 135 138 120
202212 三年一班 王二小 123 145 138
202212 三年一班 谢春花 136 140 142

Kini terdapat keperluan: setiap kelas Kemajuan dan penurunan prestasi setiap pelajar dalam setiap mata pelajaran dalam kelompok peperiksaan yang berbeza adalah seperti berikut

模拟考批次 班级 学生 语文 数学 英语
202302与202301对比 三年一班 张小明 -2 5 5
202302与202301对比 三年一班 王二小 3 -8 -2
202302与202301对比 三年一班 谢春花 -2 -1 -1
202301与202212对比 三年一班 张小明 -3 2 8
202301与202212对比 三年一班 王二小 2 1 4
202301与202212对比 三年一班 谢春花 2 3 -2

Reka bentuk dan pelaksanaan terperinci

Kelas definisi perbandingan trend 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;
    }
}

Kelas ini mentakrifkan atribut berikut:

  • Senarai medan subjek

  • Medan preposisi

  • Senarai medan perbandingan

Contohnya: Setiap pelajar dalam setiap kelasdalam setiap mata pelajaran dalam kelompok peperiksaan yang berbeza Kemajuan dan penurunan gred

Hasil pemetaan keperluan di atas ke kelas definisi adalah seperti berikut:

  • Senarai medan subjek (

    Kelas, pelajar)

  • Medan kata depan (

    Batch peperiksaan)

  • Senarai medan perbandingan (setiap mata pelajaran:

    Bahasa Cina, matematik, Bahasa Inggeris)

Kelas pelaksanaan perbandingan trend

Kelas ini menyediakan kaedah untuk panggilan luaran seperti berikut

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

Seperti yang anda lihat, kaedah ini memerlukan input

  • pengumpulan data

  • definisi perbandingan trend

Dua parameter, dan akhirnya mengembalikan keputusan ditetapkan selepas perbandingan trend.

Logik dalaman kaedah ini boleh dibahagikan kepada 2 langkah berikut:

  • Kumpulkan mengikut subjek

  • Selepas mengumpulkan , dalam kumpulan Data dibandingkan secara berpasangan dan hasil perbandingan akhirnya dikembalikan.

Kes Penggunaan

Andaikan terdapat set data seperti berikut

Apakah kaedah untuk Java menjana data perbandingan trend secara automatik?

Tentukan kelas pelajar:

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

Kami menulis kaedah yang mengembalikan data di atas:

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

Definisi perbandingan trend dan perbandingan pelaksanaan:

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

Hasilnya adalah seperti berikut:

{"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}

Atas ialah kandungan terperinci Apakah kaedah untuk Java menjana data perbandingan trend secara automatik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam