2017-09-10 46 views
1

我被要求创建一个程序,该程序从文本文件中获取项目并将其显示为格式为“LastName,FirstName ZipCode”的列表,其中邮政编码全部对齐在右侧,Last和First名称仅由逗号和空格分隔。如何在Java中右对齐我的控制台输出的单个列

我没有问题让所有事情都列出来,唯一的问题就是我要对齐邮政编码。

目前,这是我所输出格式写:

System.out.printf("%s, %s %s\n", fileList.get(lastName), fileList.get(i), fileList.get(zipCode)); 

而且我的输出是这样的(如预期):

Baron, Steven 84521 
Chill, Robert 63258 
Blanthony, Stacy 84815 
Wick, John 78412 
Yule, Katherine 42136 

(ETC)

下面是我想要它看起来:

Baron, Steven 84521 
Chill, Robert 63258 
Blanthony, Stacy 84815 
Wick, John  78412 
Yule, Katherine 42136 

我在想也许我可以做一些事情,我计算从LastName到ZIP代码的字符总数,然后从LastName和ZipCode之间的大量空格中减去,但我没有肯定该怎么做,因为它会在Strings和Ints之间弹跳。另外,我想有一个更简单的解决方案,我只是不知道。

任何帮助表示赞赏!

谢谢

CCoolant

+0

请参阅文档:http://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html –

+0

[对齐Java中的printf输出](https:// stackoverflow.com/questions/15961130/align-printf-output-in-java) – blipman17

+0

我看了user1781482发布的问题,但不明白这将如何帮助我的专栏对齐。也查看了Formatter文档,我不明白我如何使用它来实现我想要的内容,你能否进一步解释? – CCoolant

回答

0

有几个选项,这取决于你有多在乎结果,你在找什么行为。

  • 一个简单的选择就是制表符分隔,例如, System.out.printf("%s\t%s\n", foo, bar);

    大多数游戏机将调整在8列增量标签,所以只要foo值是类似的长度,你会得到很好的分离结果,但他们仍然是左对齐,有时可能会落得个人行未对齐的,例如,您的数据是这样的(我用的空间,以确保一致的显示器,假装他们是标签):

    Baron, Steven 84521 
    Chill, Robert 63258 
    Blanthony, Stacy  84815 
    Wick, John  78412 
    Yule, Katherine 42136 
    

    优点:易写,易为机器解析(这是TSV data)。

    缺点:由于宽度不同的列不一致,因此不一定容易让人阅读。

  • 正如在注释中所建议的那样,格式器语法通过指定字段的[width]来支持右对齐,例如, System.out.printf("%s %10s\n", foo, bar)将确保字段为至少 10个字符宽。如果您事先知道该字段的最大宽度,或者能够首先对数据进行传递以计算该数据,那么这很有效。

    优点:右对齐。 这可能是你想要的。

    缺点:需要知道您的数据有多宽,否则它会溢出,看起来与标签解决方案一样糟糕。

  • 使用Guava的Strings.padStart()或类似的工具将所有字符串填充到相同的宽度。这基本上只是格式化程序的宽度选项的手动等价物,但在某些情况下,这可能更有意义(例如,如果您要动态计算所需的宽度)。

    优点:比格式化程序更灵活,例如,如果目标宽度是在运行时确定的。

    缺点:比格式化:)

  • 确定终端的控制台宽度,并计算所需的空间量更多的手动实际上右对齐沿的右手侧的文字屏幕。那是consoleWidth - foo.length() - bar.length()determine the console width有几种方法,其中没有一个是完美的。

    优点:实际上右对齐,看起来真的不错

    缺点:很难全面恢复,可能更多的麻烦比它的价值:)

+0

非常感谢您的详细解答!我会试验这些解决方案,看看我能得到什么。 :) – CCoolant

1

了背单词就这一个,并得到一个答案这可能会在未来帮助别人!这取决于以不同的方式设置阵列,但希望这会有一些帮助。通过连接的姓氏和名字,像这样:

String lastNameAndFirstName = (lastName + ", " + firstName); 

你可以让他们通过你确定的宽度的单个列控制的这些变量都总宽度。因此,而不是管理三列,你可以只使用两个这样做:

System.out.printf(%-20s %s, lastNameAndFirstName, zipCode); 

这应该给你类似的例子列表我上面提出:

Baron, Steven 84521 
Chill, Robert 63258 
Blanthony, Stacy 84815 
Wick, John  78412 
Yule, Katherine 42136 

这样的名字左边是左对齐的(这看起来不错),右边的数字是右对齐的。

希望别人会发现这个用法! :)