日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

使用Java打印字符串表格(中英文内容不乱)

發(fā)布時(shí)間:2025/3/19 java 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Java打印字符串表格(中英文内容不乱) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

先展示效果

為什么寫(xiě)

最近在學(xué)習(xí)使用java來(lái)編寫(xiě)cli應(yīng)用,但是在信息展示上碰到了難題。原因是沒(méi)有很好工具來(lái)展示一個(gè)由字符串組成的表格。在git上搜到阿里巴巴有一個(gè)叫做 text-ui 的開(kāi)源項(xiàng)目可以用,但是這個(gè)工具在制作表格的時(shí)候如果表格內(nèi)容是中英文混合的,表格就會(huì)亂掉。于是就自己寫(xiě)了一個(gè)工具類來(lái)打印一個(gè)字符串組成的表格

貼代碼 TextForm

package com.hebaibai.ascmd.text;import org.apache.commons.lang3.StringUtils;import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern;public class TextForm {/*** 左邊距*/protected int paddingL = 1;/*** 右邊距*/protected int paddingR = 1;/*** 標(biāo)題*/protected List<String> title = new ArrayList<>();/*** 數(shù)據(jù)*/protected List<List<String>> datas = new ArrayList<>();/*** 最大列數(shù)*/protected int maxCol = 0;/*** 每個(gè)單元格最大字符數(shù)*/protected int colMaxLength = 8;/*** 表格組成符號(hào)*/protected char separator = '.';private TextForm() {}public static TextFormBulider bulider() {return new TextFormBulider(new TextForm());}/*** 格式化輸出表格*/public void printFormat() {List<List<String>> formData = new ArrayList<>();formData.add(title);formData.addAll(datas);Map<Integer, Integer> colMaxLengthMap = colMaxLength(formData);for (int i = 0; i < formData.size(); i++) {List<String> row = formData.get(i);for (int j = 0; j < row.size(); j++) {Formatter formatter = new Formatter();String str = row.get(j);if (str.length() > colMaxLength) {str = str.substring(0, colMaxLength);}int chineseNum = getChineseNum(str);Integer maxLength = colMaxLengthMap.get(j);String val = formatter.format("%-" + (maxLength - chineseNum) + "s", str).toString();row.set(j, val);}}Map<Integer, Integer> colMinBlankLengthMap = colMinBlankLength(formData);for (int i = 0; i < formData.size(); i++) {List<String> row = formData.get(i);for (int j = 0; j < row.size(); j++) {String val = row.get(j);Integer minBlankLength = colMinBlankLengthMap.get(j);val = val.substring(0, val.length() - minBlankLength);row.set(j, val);}}String line = "";List<String> rows = new ArrayList<>();for (List<String> strings : formData) {String pL = StringUtils.repeat(" ", paddingL);String pR = StringUtils.repeat(" ", paddingR);String row = separator + pL + String.join(pL + separator + pR, strings) + pR + separator;if (line.length() < row.length()) {line = StringUtils.repeat(separator, row.length());}rows.add(row);}System.out.println(line);for (String row : rows) {System.out.println(row);System.out.println(line);}}/*** 找到每一列最大的長(zhǎng)度** @param formData* @return*/private Map<Integer, Integer> colMaxLength(List<List<String>> formData) {Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < formData.size(); i++) {int col = 0;List<String> strings = formData.get(i);while (strings.size() > col) {String val = strings.get(col);if (val.length() > colMaxLength) {val = val.substring(0, colMaxLength);strings.set(col, val);}int length = val.getBytes().length;Integer integer = map.get(col);if (integer == null) {map.put(col, length);} else {if (integer < length) {map.put(col, length);}}col++;}}return map;}/*** 找到每一列從右開(kāi)始最小的空格長(zhǎng)度** @param formData* @return*/private Map<Integer, Integer> colMinBlankLength(List<List<String>> formData) {Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < formData.size(); i++) {int col = 0;List<String> strings = formData.get(i);while (strings.size() > col) {String val = strings.get(col);int length = 0;for (int i1 = val.length() - 1; i1 >= 0; i1--) {if (val.charAt(i1) == ' ') {length++;} else {break;}}Integer integer = map.get(col);if (integer == null) {map.put(col, length);} else {if (integer > length) {map.put(col, length);}}col++;}}return map;}/*** 獲取中文數(shù)量** @param val* @return*/private int getChineseNum(String val) {if (val == null) {val = "null";}String regex = "[\u4e00-\u9fa5|。|,]";ArrayList<String> list = new ArrayList<String>();Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(val);while (matcher.find()) {list.add(matcher.group());}int size = list.size();return size;}}復(fù)制代碼

貼代碼 TextFormBulider

package com.hebaibai.ascmd.text;import java.util.ArrayList; import java.util.List;public class TextFormBulider {private TextForm textForm;protected TextFormBulider(TextForm textForm) {this.textForm = textForm;}public TextFormBulider title(String... titles) {if (textForm.maxCol < titles.length) {textForm.maxCol = titles.length;}for (String title : titles) {if (title == null) {title = "null";}textForm.title.add(title);}return this;}public TextFormBulider paddingL(int paddingL) {textForm.paddingL = paddingL;return this;}public TextFormBulider paddingR(int paddingR) {textForm.paddingR = paddingR;return this;}public TextFormBulider separator(char separator) {textForm.separator = separator;return this;}public TextFormBulider colMaxLength(int colMaxLength) {textForm.colMaxLength = colMaxLength;return this;}public TextFormBulider addRow(String... cols) {if (textForm.maxCol < cols.length) {textForm.maxCol = cols.length;}List<String> list = new ArrayList<>(cols.length);for (String col : cols) {if (col == null) {col = "null";}list.add(col);}textForm.datas.add(list);return this;}public TextForm finish() {int titleSize = textForm.title.size();if (titleSize < textForm.maxCol) {for (int i = 0; i < textForm.maxCol - titleSize; i++) {textForm.title.add(null);}}for (List<String> data : textForm.datas) {int dataSize = data.size();if (dataSize < textForm.maxCol) {for (int i = 0; i < textForm.maxCol - dataSize; i++) {data.add(null);}}}return textForm;}} 復(fù)制代碼

測(cè)試代碼

package com.hebaibai.ascmd.text;import org.junit.Test;import static org.junit.Assert.*;public class TextFormTest {@Testpublic void printFormat() {TextForm.bulider().title("name", "age", "sex")//設(shè)置標(biāo)題.addRow("王麻345子", "21", "男2")//添加行.addRow("wzeefgrerhei", "21", "男")//添加行.colMaxLength(5)//設(shè)置單元格最大數(shù)據(jù)長(zhǎng)度.separator('*')//設(shè)置表格由什么符號(hào)構(gòu)成.paddingR(2)//右邊距.paddingL(2)//左邊距.finish()//完成.printFormat();//打印} } 復(fù)制代碼

原文鏈接 :www.hebaibai.com/?p=371

轉(zhuǎn)載于:https://juejin.im/post/5cb426865188257abe6608d0

總結(jié)

以上是生活随笔為你收集整理的使用Java打印字符串表格(中英文内容不乱)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄av网 | 国产91精品一区二区绿帽 | 国产99精品视频 | 久久亚洲天堂网 | 四虎影视精品 | 国产av无毛| 亚洲图片激情小说 | 99re这里只有精品在线 | 天天爽夜夜春 | 亚洲天堂男人的天堂 | 久久国产激情 | 十大污网站 | 免费成人激情视频 | 亚洲综合天堂 | 少妇人妻偷人精品一区二区 | 性生交大片免费看狂欲 | 高h喷水荡肉少妇爽多p视频 | 黄色电影在线视频 | 综合久久五月 | 噜噜噜久久,亚洲精品国产品 | 放荡的少妇2欧美版 | 青青草国产在线观看 | 日韩在线观看精品 | 黑人专干日本人xxxx | 777米奇影视第四色 五月丁香久久婷婷 | 人妖天堂狠狠ts人妖天堂狠狠 | av不卡一区二区三区 | 成人无码精品1区2区3区免费看 | 欧美a级肉欲大片xxx | 蜜臀精品一区二区三区 | 色www亚洲国产张柏芝 | 看片网址国产福利av中文字幕 | 欧美1| 欧美大尺度做爰啪啪床戏明星 | 久久国产经典视频 | 亚洲一区二区三区国产 | 很黄的性视频 | 美女扒开腿让人桶爽原神 | 成人免费高清视频 | 天堂在线中文资源 | 毛片在线免费播放 | 日韩爽爽视频 | 午夜看片网站 | 农村妇女精品一区二区 | 日韩在线视频看看 | 手机在线看永久av片免费 | 依依综合网 | 黄色成年人 | 欧美一区网站 | 女性裸体不遮胸图片 | 五月av综合av国产av | 一本色道久久88亚洲精品综合 | 韩国三色电费2024免费吗怎么看 | 超碰人人干 | 67194av| 亚洲综人网 | 国产精品久久久久久久免费看 | 香蕉视频1024| 亚洲黄色小说网 | 精品av一区二区 | 人人妻人人爽一区二区三区 | 波多野结衣一区二 | 日韩国产三级 | 欧美激情一区 | 成人在线欧美 | 五月天在线观看 | 国产午夜精品在线观看 | wwwxx日本| 日韩精品在线观看视频 | 亚洲成熟少妇视频在线观看 | 亚洲色图吧 | 国产113页 | 在线视频二区 | 青青超碰 | 日本在线观看www | 久久艹精品 | yy色综合 | 日韩欧美一级大片 | 午夜激情综合 | 精品99久久久 | 成年人网站av | 日韩综合| 在线看的av网站 | 一级做a爰片毛片 | 不卡的一区二区 | 伊人三级 | 久久久无码人妻精品无码 | 大桥未久在线视频 | 午夜激情影院 | 久久精品人妻一区二区三区 | 久久综合伊人77777麻豆 | 久久中文字幕一区 | 亚洲成人av影片 | 亚洲色图50p| 日本欧美成人 | 久久久久久久久久久久久久av | 免费人成自慰网站 | 一区二区三区在线免费 | 国产一区二区三区四区视频 |