日韩性视频-久久久蜜桃-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ò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 老司机深夜网站 | 欧美亚韩一区二区三区 | 欧美成人精品一区二区三区 | 91香蕉一区二区三区在线观看 | 97精品人人妻人人 | 99精品乱码国产在线观看 | 亚洲精品国产99 | 亚洲精品在线影院 | 成人拍拍 | 国产在线日本 | 中文字幕有码无码人妻av蜜桃 | 三上悠亚久久精品 | 黄色成人在线播放 | 精品美女一区二区三区 | 君岛美绪在线 | 日韩激情视频网站 | 极品销魂美女少妇尤物 | 成人国产一区二区三区精品麻豆 | 超碰pron| 亚洲福利在线播放 | 大尺度做爰呻吟舌吻网站 | 日本精品在线播放 | 精品无码人妻一区二区三区 | 日韩精品中文字幕在线观看 | 日韩精美视频 | 国产精品一级黄色片 | 黄色免费国产 | 国产永久免费观看 | 亚洲高清视频网站 | 天天视频色 | 中文字幕av久久 | 欧美激情 一区 | 黑人3p波多野结衣在线观看 | 污污网站在线观看视频 | 99热这里只有精品首页 | 中文字幕在线观看91 | 国产一区视频观看 | 外国电影免费观看高清完整版 | いいなり北条麻妃av101 | 亚洲88av| 国产精品一区二区毛片 | 国产精品人人爽 | 亚洲色图网友自拍 | 亚洲色图插插插 | 国产精选视频 | 真人毛片97级无遮挡精品 | 日本不卡影院 | 欧美极品少妇无套实战 | 人人看人人模 | 天天插天天干天天操 | 精品在线观看一区二区 | 国产网址在线观看 | 午夜影院久久 | 色老头综合 | www激情 | 99久久久无码国产精品性黑人 | 国产精品久久影院 | 美女脱裤子让男人捅 | av噜噜 | 国产欧美精品区一区二区三区 | 亚欧精品视频一区二区三区 | 另类中文字幕 | 日韩成人在线视频观看 | 国产黄在线播放 | 久久久久久成人精品 | 天天都色| 色多多入口 | 亚洲图片自拍偷拍 | 2017日日夜夜 | 国产亚洲精久久久久久无码苍井空 | 手机看片日韩欧美 | 97超碰超碰 | 四虎永久地址 | 人成在线视频 | 欧美变态网站 | 欧美精品 在线观看 | 成人国产在线观看 | 国产精品一区二区久久久 | 日本中文字幕不卡 | 一级网站在线观看 | 国产精品成人aaaa在线 | 欧美日韩精品一区二区三区视频播放 | 91av国产视频 | 日韩视频成人 | 色综合久久天天综合网 | 国产高潮视频在线观看 | 日本国产三级xxxxxx | 日本三级在线视频 | 毛片毛片女人毛片毛片 | 国产精品一亚洲av日韩av欧 | 欧美三日本三级少妇99 | 三浦惠理子aⅴ一二三区 | 香蕉视频亚洲一级 | 男女日批在线观看 | 亚洲三级国产 | 熟女视频一区二区三区 | 欧美黑人性猛交xxxx | a天堂v| 丁香婷婷六月天 |