This commit is contained in:
Looly
2020-09-30 15:37:13 +08:00
parent a849ad19c0
commit 49d5fb471f

View File

@@ -1,6 +1,7 @@
package cn.hutool.core.lang; package cn.hutool.core.lang;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.CharUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import java.util.ArrayList; import java.util.ArrayList;
@@ -15,136 +16,136 @@ import java.util.List;
*/ */
public class ConsoleTable { public class ConsoleTable {
private static final char ROW_LINE = '-'; private static final char ROW_LINE = '-';
private static final char COLUMN_LINE = '|'; private static final char COLUMN_LINE = '|';
private static final char CORNER = '+'; private static final char CORNER = '+';
private static final char SPACE = '\u3000'; private static final char SPACE = '\u3000';
private static final char LF = '\n'; private static final char LF = CharUtil.LF;
/** /**
* 表格头信息 * 表格头信息
*/ */
private final List<List<String>> HEADER_LIST = new ArrayList<>(); private final List<List<String>> HEADER_LIST = new ArrayList<>();
/** /**
* 表格体信息 * 表格体信息
*/ */
private final List<List<String>> BODY_LIST = new ArrayList<>(); private final List<List<String>> BODY_LIST = new ArrayList<>();
/** /**
* 每列最大字符个数 * 每列最大字符个数
*/ */
private List<Integer> columnCharNumber; private List<Integer> columnCharNumber;
/** /**
* 添加头信息 * 添加头信息
* *
* @param titles 列名 * @param titles 列名
* @return 自身对象 * @return 自身对象
*/ */
public ConsoleTable addHeader(String... titles) { public ConsoleTable addHeader(String... titles) {
if (columnCharNumber == null) { if (columnCharNumber == null) {
columnCharNumber = new ArrayList<>(Collections.nCopies(titles.length, 0)); columnCharNumber = new ArrayList<>(Collections.nCopies(titles.length, 0));
} }
List<String> l = new ArrayList<>(); List<String> l = new ArrayList<>();
fillColumns(l, titles); fillColumns(l, titles);
HEADER_LIST.add(l); HEADER_LIST.add(l);
return this; return this;
} }
/** /**
* 添加体信息 * 添加体信息
* *
* @param values 列值 * @param values 列值
* @return 自身对象 * @return 自身对象
*/ */
public ConsoleTable addBody(String... values) { public ConsoleTable addBody(String... values) {
List<String> l = new ArrayList<>(); List<String> l = new ArrayList<>();
BODY_LIST.add(l); BODY_LIST.add(l);
fillColumns(l, values); fillColumns(l, values);
return this; return this;
} }
/** /**
* 填充表格头或者体 * 填充表格头或者体
* *
* @param l 被填充列表 * @param l 被填充列表
* @param columns 填充内容 * @param columns 填充内容
*/ */
private void fillColumns(List<String> l, String[] columns) { private void fillColumns(List<String> l, String[] columns) {
for (int i = 0; i < columns.length; i++) { for (int i = 0; i < columns.length; i++) {
String column = columns[i]; String column = columns[i];
String col = Convert.toSBC(column); String col = Convert.toSBC(column);
l.add(col); l.add(col);
int width = col.length(); int width = col.length();
if (width > columnCharNumber.get(i)) { if (width > columnCharNumber.get(i)) {
columnCharNumber.set(i, width); columnCharNumber.set(i, width);
} }
} }
} }
/** /**
* 获取表格字符串 * 获取表格字符串
* *
* @return 表格字符串 * @return 表格字符串
*/ */
@Override @Override
public String toString() { public String toString() {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
fillBorder(sb); fillBorder(sb);
fillRow(sb, HEADER_LIST); fillRow(sb, HEADER_LIST);
fillBorder(sb); fillBorder(sb);
fillRow(sb, BODY_LIST); fillRow(sb, BODY_LIST);
fillBorder(sb); fillBorder(sb);
return sb.toString(); return sb.toString();
} }
/** /**
* 填充表头或者表体信息 * 填充表头或者表体信息
* *
* @param sb * @param sb
* @param list 表头列表或者表体列表 * @param list 表头列表或者表体列表
*/ */
private void fillRow(StringBuilder sb, List<List<String>> list) { private void fillRow(StringBuilder sb, List<List<String>> list) {
for (List<String> r : list) { for (List<String> r : list) {
for (int i = 0; i < r.size(); i++) { for (int i = 0; i < r.size(); i++) {
if (i == 0) { if (i == 0) {
sb.append(COLUMN_LINE); sb.append(COLUMN_LINE);
} }
String header = r.get(i); String header = r.get(i);
sb.append(SPACE); sb.append(SPACE);
sb.append(header); sb.append(header);
sb.append(SPACE); sb.append(SPACE);
int l = header.length(); int l = header.length();
int lw = columnCharNumber.get(i); int lw = columnCharNumber.get(i);
if (lw > l) { if (lw > l) {
for (int j = 0; j < (lw - l); j++) { for (int j = 0; j < (lw - l); j++) {
sb.append(SPACE); sb.append(SPACE);
} }
} }
sb.append(COLUMN_LINE); sb.append(COLUMN_LINE);
} }
sb.append(LF); sb.append(LF);
} }
} }
/** /**
* 拼装边框 * 拼装边框
* *
* @param sb StringBuilder * @param sb StringBuilder
*/ */
private void fillBorder(StringBuilder sb) { private void fillBorder(StringBuilder sb) {
sb.append(CORNER); sb.append(CORNER);
for (Integer width : columnCharNumber) { for (Integer width : columnCharNumber) {
sb.append(Convert.toSBC(StrUtil.fillAfter("", ROW_LINE, width + 2))); sb.append(Convert.toSBC(StrUtil.fillAfter("", ROW_LINE, width + 2)));
sb.append(CORNER); sb.append(CORNER);
} }
sb.append(LF); sb.append(LF);
} }
/** /**
* 打印到控制台 * 打印到控制台
*/ */
public void print() { public void print() {
Console.print(toString()); Console.print(toString());
} }
} }