diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/ConsoleTable.java b/hutool-core/src/main/java/cn/hutool/core/lang/ConsoleTable.java new file mode 100644 index 000000000..1dd074066 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/lang/ConsoleTable.java @@ -0,0 +1,158 @@ +package cn.hutool.core.lang; + +import cn.hutool.core.convert.Convert; +import cn.hutool.core.util.StrUtil; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * 控制台打印表格工具 + * + * @author 孙宇 + * @since 5.4.4 + */ +public class ConsoleTable { + + private static final char ROW_LINE = '-'; + private static final char COLUMN_LINE = '|'; + private static final char CORNER = '+'; + private static final char SPACE = '\u3000'; + + /** + * 表格头信息 + */ + private final List> HEADER_LIST = new ArrayList<>(); + /** + * 表格体信息 + */ + private final List> BODY_LIST = new ArrayList<>(); + /** + * 每列最大字符个数 + */ + private List columnCharNumber; + + /** + * 添加头信息 + * + * @param titles 列名 + * @return 自身对象 + */ + public ConsoleTable addHeader(String... titles) { + if (columnCharNumber == null) { + columnCharNumber = new ArrayList<>(Collections.nCopies(titles.length, 0)); + } + List l = new ArrayList<>(); + fillColumns(l, titles); + HEADER_LIST.add(l); + return this; + } + + /** + * 添加体信息 + * + * @param values 列值 + * @return 自身对象 + */ + public ConsoleTable addBody(String... values) { + List l = new ArrayList<>(); + BODY_LIST.add(l); + fillColumns(l, values); + return this; + } + + /** + * 填充表格头或者体 + * + * @param l 被填充列表 + * @param columns 填充内容 + */ + private void fillColumns(List l, String[] columns) { + for (int i = 0; i < columns.length; i++) { + String column = columns[i]; + String col = Convert.toSBC(column); + l.add(col); + int width = col.length(); + if (width > columnCharNumber.get(i)) { + columnCharNumber.set(i, width); + } + } + } + + /** + * 获取表格字符串 + * + * @return 表格字符串 + */ + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + fillBorder(sb); + for (List headers : HEADER_LIST) { + for (int i = 0; i < headers.size(); i++) { + if (i == 0) { + sb.append(COLUMN_LINE); + } + String header = headers.get(i); + sb.append(SPACE); + sb.append(header); + sb.append(SPACE); + int l = header.length(); + int lw = columnCharNumber.get(i); + if (lw > l) { + for (int j = 0; j < (lw - l); j++) { + sb.append(SPACE); + } + } + sb.append(COLUMN_LINE); + } + sb.append('\n'); + } + fillBorder(sb); + for (List bodys : BODY_LIST) { + for (int i = 0; i < bodys.size(); i++) { + if (i == 0) { + sb.append(COLUMN_LINE); + } + String body = bodys.get(i); + sb.append(SPACE); + sb.append(body); + sb.append(SPACE); + int l = body.length(); + int lw = columnCharNumber.get(i); + if (lw > l) { + for (int j = 0; j < (lw - l); j++) { + sb.append(SPACE); + } + } + sb.append(COLUMN_LINE); + } + sb.append('\n'); + } + fillBorder(sb); + return sb.toString(); + } + + /** + * 拼装边框 + * + * @param sb StringBuilder + */ + private void fillBorder(StringBuilder sb) { + sb.append(CORNER); + for (Integer width : columnCharNumber) { + sb.append(Convert.toSBC(StrUtil.fillAfter("", ROW_LINE, width + 2))); + sb.append(CORNER); + } + sb.append('\n'); + } + + /** + * 打印到控制台 + */ + public void print() { + Console.print(toString()); + } + +} \ No newline at end of file diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/ConsoleTableUtil.java b/hutool-core/src/main/java/cn/hutool/core/lang/ConsoleTableUtil.java deleted file mode 100644 index f894dbf50..000000000 --- a/hutool-core/src/main/java/cn/hutool/core/lang/ConsoleTableUtil.java +++ /dev/null @@ -1,177 +0,0 @@ -package cn.hutool.core.lang; - -import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.StrUtil; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -/** - * 控制台打印表格工具 - * - * @author 孙宇 - */ -public class ConsoleTableUtil { - /** - * 表格头信息 - */ - private final List> HEADER_LIST = new ArrayList<>(); - /** - * 表格体信息 - */ - private final List> BODY_LIST = new ArrayList<>(); - /** - * 每列最大字符个数 - */ - private List columnCharNumber; - - /** - * 测试 - * - * @param args - */ - public static void main(String[] args) { - ConsoleTableUtil t = new ConsoleTableUtil(); - t.addHeader("姓名", "年龄"); - t.addBody("张三", "15"); - t.addBody("李四", "29"); - t.addBody("王二麻子", "37"); - t.print(); - - t = new ConsoleTableUtil(); - t.addHeader("体温", "占比"); - t.addHeader("℃", "%"); - t.addBody("36.8", "10"); - t.addBody("37", "5"); - t.print(); - - t = new ConsoleTableUtil(); - t.addHeader("标题1", "标题2"); - t.addBody("12345", "混合321654asdfcSDF"); - t.addBody("sd e3ee ff22", "ff值"); - t.print(); - } - - /** - * 添加头信息 - * - * @param titles 列名 - * @return 自身对象 - */ - public ConsoleTableUtil addHeader(String... titles) { - if (columnCharNumber == null) { - columnCharNumber = new ArrayList<>(Collections.nCopies(titles.length, 0)); - } - List l = new ArrayList<>(); - HEADER_LIST.add(l); - fillColumns(l, titles); - return this; - } - - /** - * 添加体信息 - * - * @param values 列值 - * @return 自身对象 - */ - public ConsoleTableUtil addBody(String... values) { - List l = new ArrayList<>(); - BODY_LIST.add(l); - fillColumns(l, values); - return this; - } - - /** - * 填充表格头或者体 - * - * @param l - * @param columns - */ - private void fillColumns(List l, String[] columns) { - for (int i = 0; i < columns.length; i++) { - String column = columns[i]; - String col = Convert.toSBC(column); - l.add(col); - int width = col.length(); - if (width > columnCharNumber.get(i)) { - columnCharNumber.set(i, width); - } - } - } - - /** - * 获取表格字符串 - * - * @return 表格字符串 - */ - public String toString() { - StringBuilder sb = new StringBuilder(); - fillBorder(sb); - for (List headers : HEADER_LIST) { - for (int i = 0; i < headers.size(); i++) { - if (i == 0) { - sb.append('|'); - } - String header = headers.get(i); - sb.append(Convert.toSBC(" ")); - sb.append(header); - sb.append(Convert.toSBC(" ")); - int l = header.length(); - int lw = columnCharNumber.get(i); - if (lw > l) { - for (int j = 0; j < (lw - l); j++) { - sb.append(Convert.toSBC(" ")); - } - } - sb.append('|'); - } - sb.append('\n'); - } - fillBorder(sb); - for (List bodys : BODY_LIST) { - for (int i = 0; i < bodys.size(); i++) { - if (i == 0) { - sb.append('|'); - } - String body = bodys.get(i); - sb.append(Convert.toSBC(" ")); - sb.append(body); - sb.append(Convert.toSBC(" ")); - int l = body.length(); - int lw = columnCharNumber.get(i); - if (lw > l) { - for (int j = 0; j < (lw - l); j++) { - sb.append(Convert.toSBC(" ")); - } - } - sb.append('|'); - } - sb.append('\n'); - } - fillBorder(sb); - return sb.toString(); - } - - /** - * 拼装边框 - * - * @param sb - */ - private void fillBorder(StringBuilder sb) { - sb.append('*'); - for (Integer width : columnCharNumber) { - sb.append(Convert.toSBC(StrUtil.fillAfter("", '-', width + 2))); - sb.append('*'); - } - sb.append('\n'); - } - - /** - * 打印到控制台 - */ - public void print() { - Console.print(toString()); - } - -} \ No newline at end of file diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/ConsoleTableTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/ConsoleTableTest.java new file mode 100644 index 000000000..73a4f40c9 --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/lang/ConsoleTableTest.java @@ -0,0 +1,31 @@ +package cn.hutool.core.lang; + +import org.junit.Ignore; +import org.junit.Test; + +public class ConsoleTableTest { + + @Test + @Ignore + public void printTest(){ + ConsoleTable t = new ConsoleTable(); + t.addHeader("姓名", "年龄"); + t.addBody("张三", "15"); + t.addBody("李四", "29"); + t.addBody("王二麻子", "37"); + t.print(); + + t = new ConsoleTable(); + t.addHeader("体温", "占比"); + t.addHeader("℃", "%"); + t.addBody("36.8", "10"); + t.addBody("37", "5"); + t.print(); + + t = new ConsoleTable(); + t.addHeader("标题1", "标题2"); + t.addBody("12345", "混合321654asdfcSDF"); + t.addBody("sd e3ee ff22", "ff值"); + t.print(); + } +}