修正一个表头错位的bug,并且优化了代码

This commit is contained in:
SunYu 2020-09-28 15:06:51 +08:00
parent ff10ea0d9c
commit 7cebc9bf23

View File

@ -13,146 +13,165 @@ import java.util.List;
* @author 孙宇 * @author 孙宇
*/ */
public class ConsoleTableUtil { public class ConsoleTableUtil {
/** /**
* 每列最大字符个数 * 表格头信息
*/ */
private List<Integer> columnCharNumber; 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;
/** /**
* 添加头信息 * 测试
* *
* @param columns 列名 * @param args
* @return 自身对象 */
*/ public static void main(String[] args) {
public ConsoleTableUtil addHeader(String... columns) { ConsoleTableUtil t = new ConsoleTableUtil();
columnCharNumber = new ArrayList<>(Collections.nCopies(columns.length, 0)); t.addHeader("姓名", "年龄");
List<String> l = new ArrayList<>(); t.addBody("张三", "15");
HEADER_LIST.add(l); t.addBody("李四", "29");
for (int i = 0; i < columns.length; i++) { t.addBody("王二麻子", "37");
String column = columns[i]; t.print();
String col = Convert.toSBC(column);
l.add(col);
int width = col.length();
columnCharNumber.set(i, width);
}
return this;
}
/** t = new ConsoleTableUtil();
* 添加体信息 t.addHeader("体温", "占比");
* t.addHeader("", "%");
* @param values 列值 t.addBody("36.8", "10");
* @return 自身对象 t.addBody("37", "5");
*/ t.print();
public ConsoleTableUtil addBody(String... values) {
List<String> l = new ArrayList<>();
BODY_LIST.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;
}
/** t = new ConsoleTableUtil();
* 获取表格字符串 t.addHeader("标题1", "标题2");
* t.addBody("12345", "混合321654asdfcSDF");
* @return 表格字符串 t.addBody("sd e3ee ff22", "ff值");
*/ t.print();
public String toString() { }
StringBuilder sb = new StringBuilder();
border(sb);
for (List<String> 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');
}
border(sb);
for (List<String> 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');
}
border(sb);
return sb.toString();
}
private void border(StringBuilder sb) { /**
sb.append('*'); * 添加头信息
for (Integer width : columnCharNumber) { *
sb.append(Convert.toSBC(StrUtil.fillAfter("", '-', width + 2))); * @param titles 列名
sb.append('*'); * @return 自身对象
} */
sb.append('\n'); public ConsoleTableUtil addHeader(String... titles) {
} if (columnCharNumber == null) {
columnCharNumber = new ArrayList<>(Collections.nCopies(titles.length, 0));
}
List<String> l = new ArrayList<>();
HEADER_LIST.add(l);
fillColumns(l, titles);
return this;
}
public void print() { /**
Console.print(toString()); * 添加体信息
} *
* @param values 列值
* @return 自身对象
*/
public ConsoleTableUtil addBody(String... values) {
List<String> l = new ArrayList<>();
BODY_LIST.add(l);
fillColumns(l, values);
return this;
}
public static void main(String[] args) { /**
ConsoleTableUtil t = new ConsoleTableUtil(); * 填充表格头或者体
t.addHeader("姓名", "年龄"); *
t.addBody("张三", "15"); * @param l
t.addBody("李四", "29"); * @param columns
t.addBody("王二麻子", "37"); */
t.print(); private void fillColumns(List<String> 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);
}
}
}
t = new ConsoleTableUtil(); /**
t.addHeader("体温", "占比"); * 获取表格字符串
t.addHeader("", "%"); *
t.addBody("36.8", "10"); * @return 表格字符串
t.addBody("37", "5"); */
t.print(); public String toString() {
StringBuilder sb = new StringBuilder();
fillBorder(sb);
for (List<String> 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<String> 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();
}
t = new ConsoleTableUtil(); /**
t.addHeader("标题1", "标题2"); * 拼装边框
t.addBody("12345", "混合321654asdfcSDF"); *
t.addBody("sd e3ee ff22", "ff值"); * @param sb
t.print(); */
} 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());
}
} }