PrettyTable(Java版)
背景
使用Java语言实现一个简单小工具时,需要对工具产生的结果进行输出。输出仅仅打印到控制台即可,而不用通过文件持久化,数据库持久化等。实现工具逻辑并不复杂,但到了打印结果时,发现并没有到达预期目标,尤其是表格对齐问题。虽然通过制表符解决了大部分,但对于工具结果的不确定性,可能会存在中文,到最后,也没办法对齐。
想起Python语言有一个第三方库,即prettytable,是可以实现这个功能的,想找到Java版的,直接使用。但找了一圈,除了一些简单的封装之外,没有相同的了。
所以自己简单地封装了一个,在这个工具中使用地同时,以后也可以直接拿来使用。
整篇将会围绕以下几个部分展开:需求分析,问题与解决方案,示例
参考连接
Python的Prettytable
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|
——————————————————————————————————————————————
总结
当然,该项目还是有些地方需要进行修改与完善。不过,也是需要相关示例出现与预期相反的情况下,才能进行推进的。所以,要多使用与多完善。