데이터 간 쌍별 추세 비교는 아래와 같이 데이터 분석 응용 프로그램에서 매우 일반적인 응용 시나리오입니다.
모의 테스트 배치 | 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 |
다음과 같이 다양한 시험 배치에서 각 과목의 각 학생 성적 진행 상황과 하락세에 대한 데이터를 얻으세요.
모의고사학생 | 중국어 | 수학 | 영어 | 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; }보시다시피 이 메소드에는
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가 추세 비교 데이터를 자동으로 생성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!