>  기사  >  Java  >  Java가 추세 비교 데이터를 자동으로 생성하는 방법은 무엇입니까?

Java가 추세 비교 데이터를 자동으로 생성하는 방법은 무엇입니까?

王林
王林앞으로
2023-05-03 09:37:06898검색

Background

데이터 간 쌍별 추세 비교는 아래와 같이 데이터 분석 응용 프로그램에서 매우 일반적인 응용 시나리오입니다.

모의 테스트 배치 Class Students English Mathematics English
202302 3년마다 수업 장샤오밍 130 145 133
202302 3년마다 수업 왕어소 1 28 138 140
202302 3년마다 수업 Xie Chunhua 136 142 139
202301 3년마다 수업 Zhang Xiaoming 132 140 128
202301 3년마다 수업 왕얼초등학교 125 146 142
202301 3년마다 수업 Xie Chunhua 138 14 3 140
202212 3년마다 수업 Zhang Xiaoming 135 138 120
202212 3년마다 수업 Wang Erxiao 123 145 138
202212 수업 세 개의 Xie Chunhua 136 140 142

다음과 같이 다양한 시험 배치에서 각 과목의 각 학생 성적 진행 상황과 하락세에 대한 데이터를 얻으세요.

모의고사Class3년반3년 동안 3반3년마다 수업3년반 Three 올해의 첫 수업3학년 3학년세부 설계 및 구현트렌드 비교 정의 클래스 TrendCompare
학생 중국어 수학 영어 202302년과 202301년 비교
장샤오밍 -2 5 5 202302와 202301의 비교
Wang Er Xiao 3 -8 -2 202302와 202301의 비교
시춘화 -2 -1 -1 202301과 202212 비교
장샤오밍 -3 2 8 202301과 202212의 비교
Wang Er Xiao 2 1 4 202301과 202212의 비교
Xie Chunhua 2 3 -2
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;
    }
}

이 클래스는 다음 속성을 정의합니다.

주제의 필드 목록

  • 전치사 필드

  • 필드 목록

  • 예:

    각 수업의 각 학생
  • 다른
시험 배치

각 과목s의 진행 및 쇠퇴s

위 요구 사항을 정의된 수업에 매핑한 결과는 다음과 같습니다.

  • 과목 필드 목록(

    Class, Students)

  • 전치사 필드(

    시험 배치)

  • 비교 필드 목록(다양한 과목:

    중국어, 수학, 영어)

트렌드 비교 실행 클래스

클래스에서는 다음과 같이 외부 호출을 위한 메소드를 제공합니다

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", "&#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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제