JAVA行转列工具类(参考水中加点糖的博客做了改进)


在工作中做统计时需要将sql查询结果行转列,因此上网查找方法,最终找到了大佬水中加点糖的博客,参考了他的工具类代码。

参考链接:https://blog.csdn.net/puhaiyang/article/details/105292195

由于自身业务需求是固定列有多个,因此在他的代码上做了改进,本文给出改进后的代码及使用方法。

工具类代码

package com.jxz.jxzmes.common.util;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
 
/**
 * 行转列工具类
 */
public class RowConvertColUtil {
    private static Set<Object> headerSet;
    private static Set<Object> fixedColumnSet;
 
    private RowConvertColUtil() {
    }
 
    public static class ConvertData {
        private Set<Object> headerSet;
        private Set<Object> fixedColumnSet;
        private List<List<Object>> dataList;
 
        public ConvertData(List<List<Object>> dataList, Set<Object> headerSet, Set<Object> fixedColumnSet) {
            this.headerSet = headerSet;
            this.fixedColumnSet = fixedColumnSet;
            this.dataList = dataList;
        }
 
        public Set<Object> getHeaderSet() {
            return headerSet;
        }
 
        public void setHeaderSet(Set<Object> headerSet) {
            this.headerSet = headerSet;
        }
 
        public Set<Object> getfixedColumnSet() {
            return fixedColumnSet;
        }
 
        public void setfixedColumnSet(Set<Object> fixedColumnSet) {
            this.fixedColumnSet = fixedColumnSet;
        }
 
        public List<List<Object>> getDataList() {
            return dataList;
        }
 
        public void setDataList(List<List<Object>> dataList) {
            this.dataList = dataList;
        }
    }
 
    /**
     * 行转列,返回ConvertData
     *
     * @param orignalList   	要行转列的List
     * @param headerName    	要行转列的字段
     * @param fixedColumn  		固定列字段
     * @param valueFiedName 	行转列字段对应值列的字段名
     * @param needHeader    	是否返回表头
     * @param fixedColumnName   固定列字段名称数组
     * @param nullValue    		定义空值补数
     * @return ConvertData
     */
    public static synchronized ConvertData doConvertReturnObj(List orignalList, String headerName, String[] fixedColumn
    		, String valueFiedName, boolean needHeader,String[] fixedColumnName,String nullValue) throws Exception {
        List<List<Object>> lists = doConvert(orignalList, headerName, fixedColumn, valueFiedName, needHeader,fixedColumnName,nullValue);
        return new ConvertData(lists, headerSet, fixedColumnSet);
    }
 
    /**
     * 行转列,返回转换后的list
     *
     * @param orignalList   	要行转列的List
     * @param headerName    	要行转列的字段
     * @param fixedColumn  		固定列字段
     * @param valueFiedName 	行转列字段对应值列的字段名
     * @param needHeader    	是否返回表头
     * @param fixedColumnName   固定列字段名称数组
     * @param nullValue    		定义空值补数
     */
    public static synchronized List<List<Object>> doConvert(List orignalList, String headerName, String[] fixedColumn
    		, String valueFiedName, boolean needHeader,String[] fixedColumnName,String nullValue) throws Exception {
        headerSet = new LinkedHashSet<>();
        fixedColumnSet = new LinkedHashSet<>();
        //resultList:首行名称list
        List<List<Object>> resultList = new ArrayList<>();
 
        getHeaderfixedColumnSet(orignalList, headerName, fixedColumn);
        if (needHeader) {
            List<Object> headerList = new ArrayList<>();
            //填充进header
            for(String value:fixedColumnName) {
            headerList.add(value);
            }
            headerList.addAll(headerSet);
            resultList.add(headerList);
        }
        for (Object fixedColumnItem : fixedColumnSet) {
        	//colList:数据list
            List<Object> colList = new ArrayList<>();
            //名称
            for(String ColNameItem:fixedColumnItem.toString().split("\\|")) {
            	colList.add(ColNameItem);
        	}
            for (Object headerItem : headerSet) {
                boolean flag = true;
                for (Object orignalObjectItem : orignalList) {
                	Field fixedColumnField = null;
                	Field headerField = orignalObjectItem.getClass().getDeclaredField(headerName);
                    headerField.setAccessible(true);
                    fixedColumnField = orignalObjectItem.getClass().getDeclaredField(fixedColumn[0]);
                    fixedColumnField.setAccessible(true);
                    Field valueField = orignalObjectItem.getClass().getDeclaredField(valueFiedName);
                    valueField.setAccessible(true);
                    if (headerItem.equals(headerField.get(orignalObjectItem))) {
                        if (fixedColumnItem.toString().split("\\|")[0].equals(fixedColumnField.get(orignalObjectItem))) {
                            colList.add(valueField.get(orignalObjectItem));
                            flag = false;
                            break;
                        }
                    }
                }
                if (flag) {
                    colList.add(nullValue);
                }
            }
            resultList.add(colList);
        }
        return resultList;
    }
 
    private static void getHeaderfixedColumnSet(List orignalList, String headerName, String[] fixedColumn) {
        try {
            for (Object item : orignalList) {
            	
                Field headerField = item.getClass().getDeclaredField(headerName);
                headerField.setAccessible(true);
                headerSet.add(headerField.get(item));
                StringBuffer sBuffer = new StringBuffer();
                int len = 1;
                for(String name:fixedColumn) {
                    Field fixedColumnField = item.getClass().getDeclaredField(name);
                    fixedColumnField.setAccessible(true);
                    sBuffer.append(fixedColumnField.get(item));
                    if(len<fixedColumn.length) {
                    	sBuffer.append("|");
                    }
                    len++;
                }
                fixedColumnSet.add(sBuffer.toString());
            }
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

测试类

package com.jxz.jxzmes.common.util;

import java.util.*;

import org.springframework.stereotype.Controller;

import com.alibaba.fastjson.JSON;
import com.jxz.jxzmes.common.util.RowConvertColUtil.ConvertData;


/**
 * 行转列测试类
 */
@Controller
public class RowConvertCol {
    private static class ScoreInfo {
        private String stuName;
        private String sex;
        private Integer age;
        private String subjectName;
        private Integer value;
 
        public Integer getAge() {
			return age;
		}

		public void setAge(Integer age) {
			this.age = age;
		}

		public String getSex() {
			return sex;
		}

		public void setSex(String sex) {
			this.sex = sex;
		}

		public String getStuName() {
            return stuName;
        }
 
        public String getSubjectName() {
            return subjectName;
        }
 
        public Integer getValue() {
            return value;
        }
 
        public ScoreInfo(String stuName, String sex, Integer age, String subjectName, Integer value) {
            this.stuName = stuName;
            this.sex = sex;
            this.age = age;
            this.subjectName = subjectName;
            this.value = value;
        }
 
        @Override
        public String toString() {
            return "ScoreInfo{" +
                    "stuName='" + stuName + '\'' +
                    ", sex='" + sex + '\'' +
                    ", age='" + age + '\'' +
                    ", subjectName='" + subjectName + '\'' +
                    ", value=" + value +
                    '}';
        }
    }
 
    public static void main(String[] args) throws Exception {
        func2();
    	//testDTO();
    }
    public static void testDTO(){


    }
 
    private static void func2() throws Exception {
        List<ScoreInfo> scoreInfoList = new ArrayList<>();
        scoreInfoList.add(new ScoreInfo("张三", "男",15, "语文", 61));
        scoreInfoList.add(new ScoreInfo("张三", "男",15, "数学", 78));
        scoreInfoList.add(new ScoreInfo("张三", "男",15, "英语", 93));
        scoreInfoList.add(new ScoreInfo("李四", "男",14, "语文", 70));
        scoreInfoList.add(new ScoreInfo("李四", "男",14, "数学", 86));
        scoreInfoList.add(new ScoreInfo("李四", "男",14, "英语", 72));
        scoreInfoList.add(new ScoreInfo("王五", "男",15, "语文", 66));
        scoreInfoList.add(new ScoreInfo("赵六", "男",16, "语文", 91));
        scoreInfoList.add(new ScoreInfo("王五", "男",15, "数学", 88));
        scoreInfoList.add(new ScoreInfo("赵六", "男",16, "数学", 63));
        scoreInfoList.add(new ScoreInfo("王五", "男",15, "英语", 93));
        scoreInfoList.add(new ScoreInfo("赵六", "男",16, "英语", 58));
        scoreInfoList.add(new ScoreInfo("王七", "女",15, "英语", 65));
        scoreInfoList.add(new ScoreInfo("王七", "女",15, "数学", 91));
        for (ScoreInfo scoreInfo : scoreInfoList) {
            System.out.println(scoreInfo.toString());
        }
 
        System.out.println("-------------------");
        //doConvertReturnObj(要行转列的List,要行转列的字段,固定列字段数组,行转列对应值列的字段,是否返回表头,固定列字段名称数组,定义空值补数)
        String[] fixedColumn = {"stuName","sex","age"};
        String[] fixedColumnName = {"姓名","性别","年龄"};
        ConvertData lists = RowConvertColUtil.doConvertReturnObj(scoreInfoList, "subjectName", fixedColumn, "value", true,fixedColumnName,"0");
 
        for (List<Object> list : lists.getDataList()) {
            System.out.println(list.toString());
        }
    	List<TestDTO> dtoList = new ArrayList<>();
    	TestDTO dto=null;
        System.out.println("lists.getDataList().size():"+lists.getDataList().size());
        System.out.println("-------------------");
        System.out.println(lists.getfixedColumnSet());
        System.out.println("lists.getFirstColSet().size():"+lists.getfixedColumnSet().size());
        System.out.println(lists.getHeaderSet());
        System.out.println("lists.getHeaderSet().size():"+lists.getHeaderSet().size());
        System.out.println("-------------------");
        
    }
}

如何使用

根据自身需要,调用工具类中的doConvertReturnObj或doConvert方法。
方法传参如下:
(要行转列的List,要行转列的字段,固定列字段数组,行转列对应值列的字段,是否返回表头,固定列字段名称数组,定义空值补数)

测试结果

转换前:
在这里插入图片描述
转换后:
在这里插入图片描述
其中:
stuName,sex,age为固定列。
subjectName为需要行转列的字段。
value为行转列对应值列的字段。

结尾

欢迎私信或评论交流,一起进步。

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
Java行转列工具类是一种用于将列表中的数据按照某个字段进行行转列工具类。它可以将列表中的数据按照指定的字段进行分组,然后将每个分组的数据转换为一列,最终形成一个新的表格。 引用中提供了一个使用Java行转列工具类的示例代码。该示例代码使用了一个List<Student>对象作为要进行行转列操作的列表数据,并提供了要行转列的字段、固定列字段数组、行转列对应值列的字段等参数。示例中使用了RowConvertColUtil.doConvert方法进行行转列操作,并将结果打印输出。 引用中提供了工具类的方法参数说明,可以根据自身需要选择调用doConvertReturnObj或doConvert方法,并传入相应的参数。 如果只需要获取行转列后的数据列表,可以直接调用引用中提供的方法:RowConvertColUtil.doConvertReturnObj(list, "subject", fixedColumn, "scope", true, fixedColumnName, null).getDataList()。 这个工具类可以帮助Java开发者快速实现行转列的功能,提高开发效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [提高工作效率的万能Java行列转换工具类](https://blog.csdn.net/qijing19991210/article/details/129195598)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [JAVA行转列工具类参考水中加点博客改进)](https://blog.csdn.net/y5706745/article/details/123679427)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

isjiff

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值