mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-04-19 03:01:48 +08:00
rename to ConsoleTable
This commit is contained in:
parent
4c278dcccb
commit
1c19e612fe
158
hutool-core/src/main/java/cn/hutool/core/lang/ConsoleTable.java
Normal file
158
hutool-core/src/main/java/cn/hutool/core/lang/ConsoleTable.java
Normal file
@ -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<List<String>> HEADER_LIST = new ArrayList<>();
|
||||
/**
|
||||
* 表格体信息
|
||||
*/
|
||||
private final List<List<String>> BODY_LIST = new ArrayList<>();
|
||||
/**
|
||||
* 每列最大字符个数
|
||||
*/
|
||||
private List<Integer> columnCharNumber;
|
||||
|
||||
/**
|
||||
* 添加头信息
|
||||
*
|
||||
* @param titles 列名
|
||||
* @return 自身对象
|
||||
*/
|
||||
public ConsoleTable addHeader(String... titles) {
|
||||
if (columnCharNumber == null) {
|
||||
columnCharNumber = new ArrayList<>(Collections.nCopies(titles.length, 0));
|
||||
}
|
||||
List<String> l = new ArrayList<>();
|
||||
fillColumns(l, titles);
|
||||
HEADER_LIST.add(l);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加体信息
|
||||
*
|
||||
* @param values 列值
|
||||
* @return 自身对象
|
||||
*/
|
||||
public ConsoleTable addBody(String... values) {
|
||||
List<String> l = new ArrayList<>();
|
||||
BODY_LIST.add(l);
|
||||
fillColumns(l, values);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 填充表格头或者体
|
||||
*
|
||||
* @param l 被填充列表
|
||||
* @param columns 填充内容
|
||||
*/
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取表格字符串
|
||||
*
|
||||
* @return 表格字符串
|
||||
*/
|
||||
@Override
|
||||
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(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<String> 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());
|
||||
}
|
||||
|
||||
}
|
@ -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<List<String>> HEADER_LIST = new ArrayList<>();
|
||||
/**
|
||||
* 表格体信息
|
||||
*/
|
||||
private final List<List<String>> BODY_LIST = new ArrayList<>();
|
||||
/**
|
||||
* 每列最大字符个数
|
||||
*/
|
||||
private List<Integer> 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<String> l = new ArrayList<>();
|
||||
HEADER_LIST.add(l);
|
||||
fillColumns(l, titles);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加体信息
|
||||
*
|
||||
* @param values 列值
|
||||
* @return 自身对象
|
||||
*/
|
||||
public ConsoleTableUtil addBody(String... values) {
|
||||
List<String> l = new ArrayList<>();
|
||||
BODY_LIST.add(l);
|
||||
fillColumns(l, values);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 填充表格头或者体
|
||||
*
|
||||
* @param l
|
||||
* @param columns
|
||||
*/
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取表格字符串
|
||||
*
|
||||
* @return 表格字符串
|
||||
*/
|
||||
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();
|
||||
}
|
||||
|
||||
/**
|
||||
* 拼装边框
|
||||
*
|
||||
* @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());
|
||||
}
|
||||
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user