ソースを参照

!190 ConsoleTable代码优化

Merge pull request !190 from sypro/ConsoleTable代码优化
Looly 5 年 前
コミット
a849ad19c0

+ 124 - 132
hutool-core/src/main/java/cn/hutool/core/lang/ConsoleTable.java

@@ -15,144 +15,136 @@ import java.util.List;
  */
 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 static final char ROW_LINE = '-';
+    private static final char COLUMN_LINE = '|';
+    private static final char CORNER = '+';
+    private static final char SPACE = '\u3000';
+    private static final char LF = '\n';
 
-	/**
-	 * 表格头信息
-	 */
-	private final List<List<String>> HEADER_LIST = new ArrayList<>();
-	/**
-	 * 表格体信息
-	 */
-	private final List<List<String>> BODY_LIST = new ArrayList<>();
-	/**
-	 * 每列最大字符个数
-	 */
-	private List<Integer> columnCharNumber;
+    /**
+     * 表格头信息
+     */
+    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 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 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);
-			}
-		}
-	}
+    /**
+     * 填充表格头或者体
+     *
+     * @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();
-	}
+    /**
+     * 获取表格字符串
+     *
+     * @return 表格字符串
+     */
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        fillBorder(sb);
+        fillRow(sb, HEADER_LIST);
+        fillBorder(sb);
+        fillRow(sb, BODY_LIST);
+        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');
-	}
+    /**
+     * 填充表头或者表体信息
+     *
+     * @param sb
+     * @param list 表头列表或者表体列表
+     */
+    private void fillRow(StringBuilder sb, List<List<String>> list) {
+        for (List<String> r : list) {
+            for (int i = 0; i < r.size(); i++) {
+                if (i == 0) {
+                    sb.append(COLUMN_LINE);
+                }
+                String header = r.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(LF);
+        }
+    }
 
-	/**
-	 * 打印到控制台
-	 */
-	public void print() {
-		Console.print(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(LF);
+    }
+
+    /**
+     * 打印到控制台
+     */
+    public void print() {
+        Console.print(toString());
+    }
 
 }

+ 25 - 21
hutool-core/src/test/java/cn/hutool/core/lang/ConsoleTableTest.java

@@ -5,27 +5,31 @@ 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();
+    @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();
+        Console.log();
 
-		t = new ConsoleTable();
-		t.addHeader("标题1", "标题2");
-		t.addBody("12345", "混合321654asdfcSDF");
-		t.addBody("sd   e3ee  ff22", "ff值");
-		t.print();
-	}
+        t = new ConsoleTable();
+        t.addHeader("体温", "占比");
+        t.addHeader("℃", "%");
+        t.addBody("36.8", "10");
+        t.addBody("37", "5");
+        t.print();
+
+        Console.log();
+
+        t = new ConsoleTable();
+        t.addHeader("标题1", "标题2");
+        t.addBody("12345", "混合321654asdfcSDF");
+        t.addBody("sd   e3ee  ff22", "ff值");
+        t.print();
+    }
 }