工具类之打印表格ByList

前言

昨天在测试应用的时候,因为要查看数据库表里面的数据,但是又懒得去看数据库里面查找那张表,反而直接代码查看更方便。于是做了一个打印List的工具类,可以将List里面的数据进行打印成一个表格展示,List里面的元素的字段作为表头打印,元素数据作为表体打印。请添加图片描述
目前不支持中文对齐,内容为中文会出现对不齐的现象!


代码

package org.example.common;


import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * author:keaizp
 */
public class PrintUtil {


    private static final String SPACE = " ";
    private static final String SPLIT_LINE = "-";

    /**
     * 打印表头
     * @param list
     * @param fieldWidthList
     */
    private static void printHead(List list,List<Integer> fieldWidthList) {
        int length = getTableWidth(fieldWidthList);

        Object obj = list.get(0);
        Field[] fields = obj.getClass().getDeclaredFields();
        StringBuilder builder = new StringBuilder();
        builder.append("|");
        for (int i = 0; i < fields.length; i++) {
            int fieldLength = fieldWidthList.get(i);
            String fieldName = fields[i].getName();
            if(fieldLength<fieldName.length()+1){
                fieldName = fieldName.substring(0,fieldLength-1);
            }
            builder.append(fieldName);
            builder.append(SPACE.repeat( fieldWidthList.get(i)- fieldName.length() - 1));
            builder.append("|");
        }
        printSplitLine(length);
        System.out.println(builder);
        printSplitLine(length);
    }



    /**
     * 打印表体
     * @param list
     * @param fieldWidthList
     */
    private static void printBody(List list,List<Integer> fieldWidthList) {
        Object obj = list.get(0);
        Field[] fields = obj.getClass().getDeclaredFields();

        StringBuilder builder = new StringBuilder();
        for (Object o : list) {
            builder.setLength(0);
            builder.append("|");
            for (int i = 0; i < fields.length; i++) {
                fields[i].setAccessible(true);
                try {
                    Object fieldValue = fields[i].get(o);
                    int fieldLength = fieldWidthList.get(i);
                    builderAppendField(builder, fieldValue, fieldLength);
                } catch (IllegalAccessException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println(builder);
            printSplitLine(getTableWidth(fieldWidthList));
        }
    }


    private static void builderAppendField(StringBuilder builder, Object fieldValue, int fieldLength) {
        int spaceLength = fieldValue == null ? fieldLength - 4 - 1 : fieldLength - fieldValue.toString().length() - 1;
        if (spaceLength >= 0) {
            builder.append(fieldValue);
            builder.append(" ".repeat(spaceLength));
        } else {
            builder.append(fieldValue.toString(), 0, fieldLength - 1);
        }
        builder.append("|");
    }


    /**
     * 通过每个字段的宽度取得表的长度
     * @param fieldWidthList
     * @return
     */
    private static int getTableWidth(List<Integer> fieldWidthList) {
        return fieldWidthList.stream().mapToInt(Integer::intValue).sum() + 1;
    }



    private static void printSplitLine(int size) {
        System.out.println(SPLIT_LINE.repeat(size));
    }


    /**
     * 通过List返回每个字段自适应的宽度,取字段名长度和该字段上对象长度的最大值
     * @param list
     * @return
     */
    private static List<Integer> getFieldWidthList(List list) {
        Object obj = list.get(0);
        Field[] fields = obj.getClass().getDeclaredFields();

        return Arrays.stream(fields).map(field -> {
            int realLength = field.getName().length();

            field.setAccessible(true);
            for (Object o : list) {
                try {
                    Object fieldValue = field.get(o);
                    realLength = Math.max(realLength, fieldValue == null ? 4 : fieldValue.toString().length());
                } catch (IllegalAccessException e) {
                    // Log the error and continue
                    System.err.println("Error accessing field value: " + e.getMessage());
                }
            }

            int fieldLength = realLength + 1;
            fieldLength += (4 - fieldLength % 4);
            return fieldLength;
        }).collect(Collectors.toList());
    }


    /**
     *
     * @param list
     * @param width
     * @return
     */
    private static List<Integer> getFieldWidthList(List list,int width) {
        Object obj = list.get(0);
        Field[] fields = obj.getClass().getDeclaredFields();
        return Arrays.stream(fields).map(o -> width).collect(Collectors.toList());
    }


    /**
     * 打印自适应宽度的List
     * @param list
     */
    public static void printTable(List list) {
        if (list == null || list.size() == 0) {
            return;
        }
        List<Integer> fieldWidthList = getFieldWidthList(list);

        //打印表头
        printHead(list,fieldWidthList);

        //打印表内容
        printBody(list,fieldWidthList);
    }

    /**
     * 打印固定宽度的List
     * @param list 
     * @param width 
     */
    public static void printTableFixed(List list, int width) {
        if (list == null || list.size() == 0) {
            return;
        }

        List<Integer> fieldWidthList = getFieldWidthList(list,width);

        //打印表头
        printHead(list, fieldWidthList);

        //打印表内容
        printBody(list, fieldWidthList);
    }
}

二、使用步骤

这个类提供了两个public方法:

  1. printTable方法:可以通过List里面的内容自适应,改变每个列的宽度,List里面元素字段长,则列的宽度也会相应增大。
  2. printTableFixed方法:可以设置表格的宽度,如果里面内容大于表格的宽度,内容将会被截取。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值