From ec0cf6c5dbabab7755098a3895213721f788ccda Mon Sep 17 00:00:00 2001 From: SunYu Date: Sun, 27 Sep 2020 09:37:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BAConsole=E5=A2=9E=E5=8A=A0=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E8=A1=A8=E6=A0=BC=E7=9A=84=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E4=B8=BA=E4=BA=86=E4=B8=8D=E6=B1=A1=E6=9F=93Console=E7=B1=BB?= =?UTF-8?q?=EF=BC=8C=E5=85=88=E5=BB=BA=E7=AB=8B=E4=B8=80=E4=B8=AAConsoleTa?= =?UTF-8?q?bleUtil=EF=BC=8C=E7=AD=89=E5=BE=85=E8=B7=AF=E6=80=BB=E6=94=B9?= =?UTF-8?q?=E9=80=A0=E4=B8=80=E4=B8=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/lang/ConsoleTableUtil.java | 158 ++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 hutool-core/src/main/java/cn/hutool/core/lang/ConsoleTableUtil.java 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 new file mode 100644 index 000000000..600940b8b --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/lang/ConsoleTableUtil.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 孙宇 + */ +public class ConsoleTableUtil { + /** + * 每列最大字符个数 + */ + private List columnCharNumber; + /** + * 表格头信息 + */ + private List> headerList = new ArrayList<>(); + /** + * 表格体信息 + */ + private List> bodyList = new ArrayList<>(); + + /** + * 添加头信息 + * + * @param columns 列名 + * @return 自身对象 + */ + public ConsoleTableUtil addHeader(String... columns) { + columnCharNumber = new ArrayList<>(Collections.nCopies(columns.length, 0)); + List l = new ArrayList<>(); + headerList.add(l); + for (int i = 0; i < columns.length; i++) { + String column = columns[i]; + String col = Convert.toSBC(column); + l.add(col); + int width = col.length(); + columnCharNumber.set(i, width); + } + return this; + } + + /** + * 添加体信息 + * + * @param values 列值 + * @return 自身对象 + */ + public ConsoleTableUtil addBody(String... values) { + List l = new ArrayList<>(); + bodyList.add(l); + for (int i = 0; i < values.length; i++) { + String value = values[i]; + String val = Convert.toSBC(value); + l.add(val); + int width = val.length(); + if (width > columnCharNumber.get(i)) { + columnCharNumber.set(i, width); + } + } + return this; + } + + /** + * 获取表格字符串 + * + * @return 表格字符串 + */ + public String toString() { + StringBuilder sb = new StringBuilder(); + border(sb); + for (List headers : headerList) { + 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'); + } + border(sb); + for (List bodys : bodyList) { + 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'); + } + border(sb); + return sb.toString(); + } + + private void border(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()); + } + + 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(); + } + +} \ No newline at end of file