后端实现行转列 主附表方式(可以直接使用的工具类,附带测试方法,测试结果)

本文主要是介绍后端实现行转列 主附表方式(可以直接使用的工具类,附带测试方法,测试结果),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

后端实现行转列 主附表方式

  • 为什么使用行转列
  • 后端实现行转列的方法
  • 注意事项
  • 使用例子:
    • 测试方法
    • 结果

为什么使用行转列

  有些时候,因为业务问题,我们需要对附表数据进行行转列,比如:工厂中在对产品排生产计划时,会排每一天生产多少产品,而这个每天生产多少是滚动的,这个月有,下个月也有,下一年也有可能有,所以用主附表的方式表现就不是很直观,所以也就需要用到行转列表现到一个表里,再根据时间进行筛选,选择看那一段时间的。

表现形式:
在这里插入图片描述

后端实现行转列的方法

 为了能重复使用,我写了一个实现行转列的方法:
上代码:

package org.jeecg.common.util;import org.jeecg.common.exception.JeecgBootException;import java.util.*;/*** @author dawei*/
public class RowTransforColumn {/*** 进行行转列(主附表式)* @param mainData              主表数据* @param detailData            附表数据* @param relationshipInMain    主表关系字段集合  (请按照对应顺序存放)* @param relationshipInDetail  副表关系字段集合  (请按照对应顺序存放)* @param transforColumn        要进行行转列的字段 (字段名)* @param reansforDate          要进行行转列的字段数据  (字段名)* @param detailColumns         附表列(可不传,如果需要让行转列后的数据 只要某些列 就要填)如果不填请传”null“* @param defaultValue          行转列的列的默认值* @return   合并后的数据放在主表中返回*/public static List<Map<String,Object>> rowTransforColumn(List<Map<String,Object>> mainData,List<Map<String,Object>> detailData,List<String> relationshipInMain,List<String> relationshipInDetail,String transforColumn,String reansforDate,List<String> detailColumns,Object defaultValue){
//        //存放行转列后的结果
//        List<Map> res = new LinkedList<>();
//        Map<String,List<Map<String,Object>>> details = new HashMap<>();Map<String,Object> detailMaps = new HashMap<>();//记录准备指定列if (detailColumns!=null){for(String column:detailColumns){detailMaps.put(column,defaultValue);}}else {//指定列为空 自动定位  遍历附表数据for (Map<String,Object> map:detailData){Object object = map.get(transforColumn);if (object == null){throw new JeecgBootException("转置的列在附表中不存在");}//如果附表数据对应日期存在if (!detailMaps.containsKey(object.toString())){//放入列中detailMaps.put(object.toString(),defaultValue);}}}//记录映射关系Map<String,Map<String,Object>> mainDateMap = new HashMap<>();for (Map<String,Object> mainMap : mainData){//多个关系列组成的唯一标识String key = "";for (String relation:relationshipInMain){Object object = mainMap.get(relation);if (object==null){throw new JeecgBootException("关系列:"+relation+",在主表中不存在");}key+=object.toString()+",";}mainMap.putAll(detailMaps);mainDateMap.put(key,mainMap);}//遍历附表数据for (Map<String,Object> map:detailData){//多个关系列组成的唯一标识String key = "";for (String relation:relationshipInDetail){Object object = map.get(relation);if (object==null){throw new JeecgBootException("关系列:"+relation+",在副表中不存在");}key+=object.toString()+",";}//找关联关系 主表数据Map<String,Object> mainMap = mainDateMap.get(key);if (mainMap!=null){//添加到主表中mainMap.replace(map.get(transforColumn).toString(),map.get(reansforDate));}}return mainData;}
}

注意事项

  • 代码参数,主表数据和附表数据都是map类型;
  • 主表数据和附表数据必须有关联关系。
  • 他们的关系字段可以是多个。但是必须按顺序一一对应;
  • 附表行转列后的数据是直接放进主表数据集合中的;
  • 代码中使用的异常,需要自己进行定义。或者直接抛出Exception也可以。

使用例子:

测试方法

package rowToColumn;import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;public class test {public static void main(String[] args) {//主表数据List<Map<String,Object>> planMains = new LinkedList<>();for (int i = 0;i<10;i++){Map<String,Object> mainMap = new HashMap<>();mainMap.put("plan_no",i);mainMap.put("name","jihua"+i);mainMap.put("erp_code","chanpin"+i);planMains.add(mainMap);}//附表数据List<Map<String,Object>> planDetails = new LinkedList<>();SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");Random random = new Random();for (int i =0;i<10;i++){for (int t = 0;t<5;t++){Date date=new Date();Calendar calendar = new GregorianCalendar();calendar.setTime(date);calendar.add(Calendar.DATE,t);date=calendar.getTime();Map<String,Object> detailMap = new HashMap<>();detailMap.put("detail_no",t);detailMap.put("plan_no",i);detailMap.put("plan_time",format.format(date));detailMap.put("plan_num", random.nextInt());planDetails.add(detailMap);}}//主表关系列List<String> relationshipInMain = new LinkedList<>();relationshipInMain.add("plan_no");//附表关系列List<String> relationshipInDetail = new LinkedList<>();relationshipInDetail.add("plan_no");try {List<Map<String,Object>> datas = RowTransforColumn.rowTransforColumn(planMains,planDetails,relationshipInMain,relationshipInDetail,"plan_time","plan_num",null,null);System.out.println(datas);} catch (Exception exception) {exception.printStackTrace();}}
}

结果

转换前:
在这里插入图片描述
转换后:
在这里插入图片描述

这篇关于后端实现行转列 主附表方式(可以直接使用的工具类,附带测试方法,测试结果)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/397784

相关文章

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停

基于Python实现读取嵌套压缩包下文件的方法

《基于Python实现读取嵌套压缩包下文件的方法》工作中遇到的问题,需要用Python实现嵌套压缩包下文件读取,本文给大家介绍了详细的解决方法,并有相关的代码示例供大家参考,需要的朋友可以参考下... 目录思路完整代码代码优化思路打开外层zip压缩包并遍历文件:使用with zipfile.ZipFil

如何使用Nginx配置将80端口重定向到443端口

《如何使用Nginx配置将80端口重定向到443端口》这篇文章主要为大家详细介绍了如何将Nginx配置为将HTTP(80端口)请求重定向到HTTPS(443端口),文中的示例代码讲解详细,有需要的小伙... 目录1. 创建或编辑Nginx配置文件2. 配置HTTP重定向到HTTPS3. 配置HTTPS服务器

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java Optional的使用技巧与最佳实践

《JavaOptional的使用技巧与最佳实践》在Java中,Optional是用于优雅处理null的容器类,其核心目标是显式提醒开发者处理空值场景,避免NullPointerExce... 目录一、Optional 的核心用途二、使用技巧与最佳实践三、常见误区与反模式四、替代方案与扩展五、总结在 Java

基于Java实现回调监听工具类

《基于Java实现回调监听工具类》这篇文章主要为大家详细介绍了如何基于Java实现一个回调监听工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录监听接口类 Listenable实际用法打印结果首先,会用到 函数式接口 Consumer, 通过这个可以解耦回调方法,下面先写一个