热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java代码自动对齐_java程序实现编写代码时变量名垂直对齐的风格

记录英语单词时,想把英语和中文翻译分别对齐,有些人写代码喜欢把变量按这种方式对齐。在网上没搜到相关方法,于是自己试着写代码去实现ÿ

记录英语单词时,想把英语和中文翻译分别对齐,有些人写代码喜欢把变量按这种方式对齐。在网上没搜到相关方法,于是自己试着写代码去实现,原本以为很简单,写的时候才发现有不少问题。先看效果:

普通的

对齐前:

f2b5980235eb773004cf55f29da08060.png

对齐后:

3eed350f83518c3a6546c6e64c9ee79f.png

发挥点创意

对齐前:

7a3e58607dc49befe616599936018c19.png

对齐后:

1771a534d45a793613d8445c115e7cfd.png

实现

实现的思路比较简单,读取文本文件,按正则分割,找出最长的部分,补齐空格,输出。

看起来相当简单,花了一个多小时,就写出来了,马上运行,发现输出一团糟,去查看每个部分的字符数,个数是一样的,网上一搜,原来跟字体有关系,好吧,那换个等宽的字体。换好字体后有些地方已经对齐了,有些地方还是没对齐,发现是中文的问题,中文宽度与英文宽度不相同,于是首先根据正则去判断字符是中文还是英文,然后自己实现计算字符长度的方法,在判断中文字符上折腾了许久,因为标点符号等等都要考虑进去,反正是来来回回试了好久,对Unicode编码范围不熟悉,没办法。终于,好像都搞定了,反复测试,突然发现第一行的对齐少了一个空格,尼玛,这是怎么回事啊,Debug发现第一行的最开始有一个奇怪的字符"\uFEFF",这他妈是什么鬼,上网搜,发现是Unicode编码的什么BOM头,好吧,不管它是什么鬼,直接把它去掉了……

反正是遇到了各种各样的问题,与字符集相关的问题实在是太头疼了。另外,我没有去处理编码的问题,所以文本的编码需要和IDE的编码保持一致,否则就会产生乱码。

源码

看过《重构》和《代码整洁之道》之后,写代码时时刻想着要写干净点,扩展性强点,经过反复修改,最终自己觉得还行吧,当然,肯定有不少值得改进的地方,现在就这样吧。

App.java

1 packagetextalign;2

3 importjava.io.IOException;4

5 /**

6 *@authortingl7 *@version2017/9/278 */

9 public classApp {10

11 public static voidmain(String[] args) {12 long start =System.currentTimeMillis();13

14 String filePath = "C:\\Users\\tingl\\Desktop\\Test2.txt";15 TextAlign textAlign = new TextAlign(/*",|。|,|[.]|( {2,})|\t| +"*/);16

17 if (args.length > 0) {18 filePath = args[0];19 }20 try{21 textAlign.align(filePath);22 } catch(IOException e) {23 e.printStackTrace();24 }25

26 System.out.println(System.currentTimeMillis() -start);27 }28 }

TextAlign.java

1 packagetextalign;2

3 importjava.io.IOException;4 importjava.util.List;5 importjava.util.regex.Pattern;6

7 /**

8 *@authortingl9 *@version2017/9/2710 */

11 public classTextAlign {12 private static final String CHINESE_CHARACTER = "[\u4e00-\u9fa5]|[\uFE30-\uFFA0]|[\u3000-\u303F]";13 private static final Pattern CHINESE_CHARACTER_PATTERN =Pattern.compile(CHINESE_CHARACTER);14 private static final int SEPARATE_SPACE_AMOUNT = 4;15

16 privateTextAlignFileUtil textAlignFileUtil;17 private ListtextLines;18 private int[] longestBlockLengths;19

20 publicTextAlign() {21 textAlignFileUtil = newTextAlignFileUtil();22 }23

24 publicTextAlign(String spiltRegex) {25 textAlignFileUtil = newTextAlignFileUtil(spiltRegex);26 }27

28 public void align(String filePath) throwsIOException {29 textLines =textAlignFileUtil.readToList(filePath);30 initLongestBlockLengths();31 fillTextLinesBySpaces();32 textAlignFileUtil.write();33 }34

35 private voidinitLongestBlockLengths() {36 int longestArrayLength = 0;37 for(String[] blocks : textLines) {38 if (blocks.length >longestArrayLength) {39 longestArrayLength =blocks.length;40 }41 }42 longestBlockLengths = new int[longestArrayLength];43 fillLongestBlockLengths();44 }45

46 private voidfillLongestBlockLengths() {47 for(String[] blocks : textLines) {48 if (blocks.length <2) continue;49 for (int i &#61; 0; i longestBlockLengths[i]) {52 longestBlockLengths[i] &#61;length;53 }54 }55 }56 }57

58 private intstringLengthFitWidth(String s) {59 if (!CHINESE_CHARACTER_PATTERN.matcher(s).find()) {60 returns.length();61 }62 int length &#61; 0;63 for (String c : s.split("")) {64 if(CHINESE_CHARACTER_PATTERN.matcher(c).find()) {65 length&#43;&#43;;66 }67 length&#43;&#43;;68 }69 returnlength;70 }71

72 private voidfillTextLinesBySpaces() {73 for(String[] blocks : textLines) {74 for (int i &#61; 0; i

82 private String spaces(intspaceAmount) {83 StringBuilder spaces &#61; newStringBuilder();84 for (int i &#61; 0; i

TextAlignFileUtil.java

1 packagetextalign;2

3 import java.io.*;4 importjava.util.ArrayList;5 importjava.util.Arrays;6 importjava.util.List;7

8 /**

9 *&#64;authortingl10 *&#64;version2017/9/2711 */

12 classTextAlignFileUtil {13 private static final String FILENAME_POSTFIX &#61; "_aligned";14 private String spiltRegex &#61; "( {2,})|\t";15 private ListtextLines;16 privateString outPath;17

18 TextAlignFileUtil() {19 }20

21 TextAlignFileUtil(String spiltRegex) {22 this.spiltRegex &#61;spiltRegex;23 }24

25 List readToList(String path) throwsIOException {26 File file &#61; newFile(path);27 returnreadToList(file);28 }29

30 private List readToList(File file) throwsIOException {31 getOutPath(file.getAbsolutePath());32 try (BufferedReader reader &#61; new BufferedReader(newFileReader(file))) {33 textLines &#61; new ArrayList<>();34 String line;35 while ((line &#61; reader.readLine()) !&#61; null) {36 textLines.add(removeEmptyAndTrim(line.split(spiltRegex)));37 }38 }39 removeBomHead();40 returntextLines;41 }42

43 private voidgetOutPath(String srcPath) {44 int dotPosition &#61; srcPath.lastIndexOf(".");45 outPath &#61; srcPath.substring(0, dotPosition) &#43; FILENAME_POSTFIX &#43;srcPath.substring(dotPosition);46 if (newFile(outPath).exists()) {47 getOutPath(outPath);48 }49 }50

51 privateString[] removeEmptyAndTrim(String[] src) {52 for (int i &#61; 0; i

56 List dest &#61; new ArrayList<>(Arrays.asList(src));57 dest.removeIf(String::isEmpty);58 return dest.toArray(new String[0]);59 }60

61 private voidremoveBomHead() {62 String[] blocks &#61; textLines.get(0);63 blocks[0] &#61; blocks[0].replace("\uFEFF", "");64 }65

66 void write() throwsIOException {67 try (BufferedWriter writer &#61; new BufferedWriter(newFileWriter(outPath))) {68 for(String[] blocks : textLines) {69 writer.write(getLine(blocks));70 writer.newLine();71 writer.flush();72 }73 }74 }75

76 privateString getLine(String[] blocks) {77 StringBuilder sb &#61; newStringBuilder();78 for(String block : blocks) {79 sb.append(block);80 }81 returnsb.toString();82 }83 }



推荐阅读
  • javaftp上传,javaftp下载文件
    本文目录一览:1、javaftp上传5G以上大文件,怎么做 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了为什么在main.js中写import不会全局生效的问题,并提供了解决方案。在每一个vue文件中都需要写import语句才能使其生效,而在main.js中写import语句则不会全局生效。本文还介绍了使用Swal和sweetalert2库的示例。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文介绍了Java中Hashtable的clear()方法,该方法用于清除和移除指定Hashtable中的所有键。通过示例程序演示了clear()方法的使用。 ... [详细]
  • 正则表达式及其范例
    为什么80%的码农都做不了架构师?一、前言部分控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\, ... [详细]
  • Python 可视化 | Seaborn5 分钟入门 (六)——heatmap 热力图
    微信公众号:「Python读财」如有问题或建议,请公众号留言Seaborn是基于matplotlib的Python可视化库。它提供了一个高级界面来绘制有吸引力的统计图形。Seabo ... [详细]
author-avatar
秋荼凝脂_697
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有