Browse Source

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

SunYu 5 years ago
parent
commit
7cebc9bf23
1 changed files with 152 additions and 133 deletions
  1. 152 133
      hutool-core/src/main/java/cn/hutool/core/lang/ConsoleTableUtil.java

+ 152 - 133
hutool-core/src/main/java/cn/hutool/core/lang/ConsoleTableUtil.java

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