ホームページ  >  記事  >  Java  >  Javaで傾向比較データを自動生成する方法は何ですか?

Javaで傾向比較データを自動生成する方法は何ですか?

王林
王林転載
2023-05-03 09:37:06868ブラウズ

背景

データ間のペアごとのトレンド比較は、以下に示すように、データ分析アプリケーションにおける非常に一般的なアプリケーション シナリオです。

##202302 クラス3年张小明130145133 202302三级一王二小1281381402023023年3組謝春華1361421392023013年クラス張暁明132140128 2023013年3組王二小1251461422023013年3組謝春華1381431402022123年クラス張暁明135138120 202212三级一級王二小1231451382022123年3組謝春華136140142
模擬テスト バッチ クラス 学生 中国語 数学 英語
ここで、各クラスの各生徒の異なる試験バッチにおける各科目の各生徒の成績の進歩と低下が必要になります。取得されるデータは次のとおりです

#模擬試験バッチ#クラス学生中国語数学English3 年クラス三级一级クラス 3 3 年#202301 と 202212 の比較Three -年クラス 张小明-328202301 と 202212 の比較三一级王二小214 202301 と 202212 の比較クラス 3 年謝 春華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;
    }
}
##202302 と 202301 の比較
張暁明 -2 5 5 202302 と 202301 の比較
王二小 3 -8 #-2 202302 と 202301 の比較
謝春華 -2 -1 -1
詳細な設計と実装
このクラスは次の属性を定義します:

件名のフィールド リスト

  • 前置フィールド

  • 比較フィールド リスト

  • 例:

    異なる

    試験バッチの各クラスの各生徒の進歩と衰退
各科目

上記の要件を定義されたクラスにマッピングした結果は次のようになります。 件名フィールド リスト (

クラス、学生

)

  • 前置詞フィールド (試験バッチ)

  • 比較項目一覧(各科目:中国語、数学、英語

  • トレンド比率 実行用class、このクラスは次のような外部呼び出しのメソッドを提供します

    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 つのパラメーターを定義し、最後にトレンド比較後の結果セットを返します。
  • このメソッドの内部ロジックは、次の 2 つのステップに分割できます。

件名ごとにグループ化

グループ化後、グループ内 データはペアごとに比較され、最終的に比較結果が返されます。
  • ユース ケース
  • 次のようなデータ セットがあるとします。

学生クラスを定義します。

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

トレンド比較定義と実行比較: Javaで傾向比較データを自動生成する方法は何ですか?

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

結果は次のとおりです:

{"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で傾向比較データを自動生成する方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。