我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java自动生成趋势比对数据的方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java自动生成趋势比对数据的方法是什么

本文小编为大家详细介绍“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;        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;    }        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自动生成趋势比对数据的方法是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java自动生成趋势比对数据的方法是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java自动生成趋势比对数据的方法是什么

本文小编为大家详细介绍“Java自动生成趋势比对数据的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java自动生成趋势比对数据的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。背景数据之间两
2023-07-05

Java自动生成趋势比对数据的方法分享

这篇文章主要和大家分享了一种Java自动生成趋势比对数据的方法设计及实现,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
2023-05-14

java代码自动生成的方法是什么

在Java中,有各种工具和框架可以用于生成代码。其中最常见的是使用代码生成工具,如MyBatis Generator和Apache Velocity等。这些工具可以根据数据库表结构或其他配置文件生成相应的Java代码,包括实体类、DAO接口
java代码自动生成的方法是什么
2024-02-29

java根据数据生成图片的方法是什么

在Java中,可以使用Java 2D图形库来生成图片。以下是生成图片的一种常见方法:1. 创建一个BufferedImage对象,该对象是一个可以在内存中进行绘图的图像缓冲区。```javaBufferedImage image = new
2023-09-17

java动态生成word的方法是什么

在Java中,可以使用Apache POI库来动态生成Word文档。Apache POI是一个用于处理Microsoft文档格式的Java库,包括Word文档的操作。以下是一个示例代码,演示如何使用Apache POI创建一个简单的Word
2023-09-16

oracle自动生成序号的方法是什么

在Oracle中,可以使用序列(sequence)来自动生成序号。序列是一种数据库对象,可以生成唯一的递增或递减的数字序列。通过创建和使用序列,可以方便地为表中的记录生成唯一的序号。要创建一个序列,可以使用如下的SQL语句:CREATE
oracle自动生成序号的方法是什么
2024-04-09

mybatis自动生成主键的方法是什么

MyBatis提供了多种自动生成主键的方法,以下是其中几种常用的方法:1. 使用数据库的自增主键:在数据库中将主键字段设置为自增类型,然后在MyBatis的映射文件中不需要显式指定主键的值,数据库会自动生成主键值。示例:```xmlINSE
2023-08-19

eclipse实体类自动生成的方法是什么

Eclipse中实体类自动生成的方法通常包括以下几种:1. Getter和Setter方法:用于访问和设置实体类的属性值。2. equals方法:用于比较两个实体类对象是否相等。3. hashCode方法:用于返回实体类对象的哈希码值,通常
2023-08-15

java动态生成实体类的方法是什么

Java动态生成实体类的方法有以下几种:1. 使用反射机制动态生成实体类:可以通过Java的反射机制,使用Class对象的newInstance()方法动态生成实体类的实例对象。2. 使用代码生成工具:可以使用代码生成工具,例如JavaPo
2023-08-15

Mysql生成数据字典的方法是什么

生成MySQL数据库的数据字典可以通过以下方法:使用MySQL Workbench:MySQL Workbench是一个强大的MySQL数据库管理工具,可以通过它生成数据库文档。在MySQL Workbench中连接到数据库,选择要生成数据
Mysql生成数据字典的方法是什么
2024-04-09

java联调生成测试数据工具类的方法是什么

这篇文章主要介绍了java联调生成测试数据工具类的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java联调生成测试数据工具类的方法是什么文章都会有所收获,下面我们一起来看看吧。java联调生成测试数
2023-07-05

listview自动刷新数据的方法是什么

ListView自动刷新数据有多种方法,以下是其中的几种常用方法:1. 使用Handler和Runnable:在主线程中使用Handler和Runnable来定时刷新数据。首先在Activity或Fragment中创建一个Handler对象
2023-09-14

sqlserver数据库自动还原的方法是什么

SQL Server数据库自动还原的方法可以通过设置数据库的恢复模式和自动还原选项来实现。具体步骤如下:打开SQL Server Management Studio,连接到目标数据库服务器。在对象资源管理器中右键单击要设置自动还原的数据库,
sqlserver数据库自动还原的方法是什么
2024-04-09

Java对接ansible自动运维化平台的方法是什么

这篇文章主要介绍“Java对接ansible自动运维化平台的方法是什么”,在日常操作中,相信很多人在Java对接ansible自动运维化平台的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java对
2023-07-05

SpringBoot自定义动态切换数据源的方法是什么

本篇内容主要讲解“SpringBoot自定义动态切换数据源的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot自定义动态切换数据源的方法是什么”吧!1、添加maven依
2023-06-21

web自动化平台开发元数据的设计方法是是什么

这篇“web自动化平台开发元数据的设计方法是是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“web自动化平台开发元数据的
2023-06-04

Java中通过数据报包输送对象的方法是什么

这篇文章主要介绍“Java中通过数据报包输送对象的方法是什么”,在日常操作中,相信很多人在Java中通过数据报包输送对象的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中通过数据报包输送对象
2023-06-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录