PrettyTable(Java版)

PrettyTable(Java版)

背景

使用Java语言实现一个简单小工具时,需要对工具产生的结果进行输出。输出仅仅打印到控制台即可,而不用通过文件持久化,数据库持久化等。实现工具逻辑并不复杂,但到了打印结果时,发现并没有到达预期目标,尤其是表格对齐问题。虽然通过制表符解决了大部分,但对于工具结果的不确定性,可能会存在中文,到最后,也没办法对齐。

想起Python语言有一个第三方库,即prettytable,是可以实现这个功能的,想找到Java版的,直接使用。但找了一圈,除了一些简单的封装之外,没有相同的了。

所以自己简单地封装了一个,在这个工具中使用地同时,以后也可以直接拿来使用。

整篇将会围绕以下几个部分展开:需求分析,问题与解决方案,示例

参考连接

Python的Prettytable

prettytable · PyPI

Java控制台打印

Java Console/控制台 打印表格_j506825719的博客-CSDN博客

项目地址

PrettyTable.java · zhj1121/JavaUtilKit - 码云 - 开源中国 (gitee.com)

需求分析与解决方案

表格的同一列中的表格的长宽需要控制一致

实现有一个规律,为了控制输出长度一直,需要使用空白字符,即字符串+制表符(一定数量)的形式。

另外,创建一个列长度数组,用于存储每一列中最长字符串的长度。

等到输出时,将当前字符串与当前列最大字符串进行长度比较,并计算出制表符的数量,以实现间距相等。

表格内容为中文时,如何控制表格的长宽

因为中文一个长度单位的中文字符是大于一个长度单位的其它字符的,所以设置中文为2个字符大小。

为了方便构造,需要支持建造者模式

创建一个全局变量,用于存储内容。实现一个方法,直接返回类自身,并向全局变量加载对象。

当然,在兼有prettytable的功能的同时,也根据使用pretty table过程中的功能缺失进行补充。如以下几点

是否可以直接构造泛型prettytable,获取对象的属性名作为列名
同时,由于使用对象,所以对于null的属性值需要进行处理,使用特定的字符替代。如"“或者” null"。
支持排序

实现非常简单,使用排序算法或者Java的自实现排序算法即可

/**
 * 
 * @Title: realSort
 * @Description: 设置结果集排序
 * @param columnName
 * @param flag       布尔值, 升序true || 降序false
 */
public PrettyTable<E> sort(String columnName, boolean flag)

支持limit

直接使用Java的集合截断即可

/**
 * @title: setLimitNumbers
 * @description: 设置结果集大小
 * @param numbers int, 结果集大小 默认为-1, 表示不限制结果集大小 当设置的numbers大于结果集大小时,会返回全部结果集
 * @return
 * @date 2021-09-06 10:43:28
 */
public PrettyTable<E> setLimitNumbers(int numbers)

表格样式设置

/**
 * @title: setFrameStyle
 * @description: 设置表格边框样式
 * @param columnFrame 列与列分界线, 默认|
 * @param rowFrame    行与行分界线, 默认—
 * @return
 * @date 2021-09-06 10:35:06
 */
public PrettyTable<E> setFrameStyle(String columnFrame, String rowFrame)

示例

加入集合对象,未设置列名

代码实现

    PrettyTable<List<String>> prettyTable = new PrettyTable<List<String>>();
    List<String> arr1 = new ArrayList<String>();
    arr1.add("a");
    arr1.add("1");
    List<String> arr2 = new ArrayList<String>();
    arr2.add("b");
    arr2.add("2");
    List<String> arr3 = new ArrayList<String>();
    arr3.add("c");
    arr3.add("3");
    prettyTable.appendElement(arr3);
    prettyTable.appendElement(arr2);
    prettyTable.appendElement(arr1);
    prettyTable.print();

输出结果

——————————————
|col:0|col:1|
——————————————
|c    |3    |
——————————————
|b    |2    |
——————————————
|a    |1    |
——————————————

加入集合对象,设置列名

代码实现

    PrettyTable<List<String>> prettyTable = new PrettyTable<List<String>>();
    List<String> arr1 = new ArrayList<String>();
    arr1.add("a");
    arr1.add("1");
    List<String> arr2 = new ArrayList<String>();
    arr2.add("b");
    arr2.add("2");
    List<String> arr3 = new ArrayList<String>();
    arr3.add("c");
    arr3.add("3");
    prettyTable.appendElement(arr3);
    prettyTable.appendElement(arr2);
    prettyTable.appendElement(arr1);
    List<String> columns = new ArrayList<String>();
    columns.add("name");
    columns.add("no");
    prettyTable.setColumns(columns);
    prettyTable.print();

输出结果

——————————
|name|no|
——————————
|c   |3 |
——————————
|b   |2 |
——————————
|a   |1 |
——————————

加入对象

代码实现

    PrettyTable<People> prettyTable = new PrettyTable<People>();
    People people1 = new People(1,"张三",new Date(),"123");
    prettyTable.appendElement(people1);
    People people2 = new People(3,"Tom",new Date(),"abc");
    prettyTable.appendElement(people2);
    People people3 = new People(2,"王李一二",new Date(),"hello world");
    prettyTable.appendElement(people3);
    prettyTable.print();

输出结果

—————————————————————————————————————————————————————————————
|no|name	|date                        |say        |
—————————————————————————————————————————————————————————————
|1 |张三		|Thu Sep 09 01:20:38 CST 2021|123        |
—————————————————————————————————————————————————————————————
|3 |Tom		|Thu Sep 09 01:20:38 CST 2021|abc        |
—————————————————————————————————————————————————————————————
|2 |王李一二	|Thu Sep 09 01:20:38 CST 2021|hello world|
—————————————————————————————————————————————————————————————

加入对象,启用排序

代码实现

    PrettyTable<People> prettyTable = new PrettyTable<People>();
    People people1 = new People(1,"张三",new Date(),"123");
    prettyTable.appendElement(people1);
    People people2 = new People(3,"Tom",new Date(),"abc");
    prettyTable.appendElement(people2);
    People people3 = new People(2,"王李一二",new Date(),"hello world");
    prettyTable.appendElement(people3);
    prettyTable.sort("no", true).print();

输出结果

—————————————————————————————————————————————————————————————
|no|name	|date                        |say        |
—————————————————————————————————————————————————————————————
|1 |张三		|Thu Sep 09 01:22:29 CST 2021|123        |
—————————————————————————————————————————————————————————————
|2 |王李一二	|Thu Sep 09 01:22:29 CST 2021|hello world|
—————————————————————————————————————————————————————————————
|3 |Tom		|Thu Sep 09 01:22:29 CST 2021|abc        |
—————————————————————————————————————————————————————————————

加入对象,启用数据量限制

代码实现

    PrettyTable<People> prettyTable = new PrettyTable<People>();
    People people1 = new People(1,"张三",new Date(),"123");
    prettyTable.appendElement(people1);
    People people2 = new People(3,"Tom",new Date(),"abc");
    prettyTable.appendElement(people2);
    People people3 = new People(2,"王李一二",new Date(),"hello world");
    prettyTable.appendElement(people3);
    prettyTable.setLimitNumbers(1).print();

输出结果

——————————————————————————————————————————————
|no|name|date                        |say|
——————————————————————————————————————————————
|1 |张三	|Thu Sep 09 01:23:37 CST 2021|123|
——————————————————————————————————————————————

总结

当然,该项目还是有些地方需要进行修改与完善。不过,也是需要相关示例出现与预期相反的情况下,才能进行推进的。所以,要多使用与多完善。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值