如何在Java中对控制台输出的单个列进行右对齐
我被要求创建一个程序,从一个文本文件中提取项目,并将它们显示在一个格式为“LastName,FirstName ZipCode”的列表中,其中邮政编码都在右侧对齐,姓氏和姓氏之间仅用逗号和空格分隔 我把所有的东西都列出来没有问题,我遇到的唯一问题就是对齐邮政编码 目前,这是我为输出格式编写的内容:如何在Java中对控制台输出的单个列进行右对齐,java,Java,我被要求创建一个程序,从一个文本文件中提取项目,并将它们显示在一个格式为“LastName,FirstName ZipCode”的列表中,其中邮政编码都在右侧对齐,姓氏和姓氏之间仅用逗号和空格分隔 我把所有的东西都列出来没有问题,我遇到的唯一问题就是对齐邮政编码 目前,这是我为输出格式编写的内容: System.out.printf("%s, %s %s\n", fileList.get(lastName), fileList.get(i), fileList.get(zipCode)); 我
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
我在想也许我可以做点什么,从LastName一直到邮政编码的字符总数,然后从LastName和ZipCode之间的大量空格中减去,但我不确定该怎么做,因为它会在字符串和整数之间跳跃。此外,我想有一个更简单的解决方案,我只是不知道
感谢您的帮助
谢谢,
cCOLANT根据您对结果的关注程度以及您想要的行为,有两种选择
- 一个简单的选择是只使用制表符分隔,例如,
System.out.printf(“%s\t%s\n”,foo,bar)代码> 大多数控制台将以8列为增量对齐选项卡,因此只要
值的长度相似,您将得到很好的分隔结果,尽管它们仍然左对齐,有时可能会导致单独的行未对齐,例如,您的数据如下所示(我使用空格确保显示一致,假装它们是选项卡): 优点:易于编写,易于机器解析(它是一个很好的工具) 缺点:对一个人来说不一定很容易阅读,因为不同宽度的列不会排成一行foo
- 正如注释中所建议的,格式化程序语法通过指定字段的
来支持正确对齐,例如[width]
将确保字段宽度至少为10个字符。如果您事先知道字段的最大宽度,或者能够首先传递数据以计算它,则此操作非常有效 好处:正确解释。这可能是您想要的。 缺点:需要知道你的数据有多宽,否则它会溢出,看起来和标签解决方案一样糟糕System.out.printf(“%s%10s\n”,foo,bar)
- 使用Guava或类似工具将所有字符串填充到相同的宽度。这基本上只是格式化程序的宽度选项的手动等效项,但在某些情况下,这可能更有意义(例如,如果您正在动态计算所需的宽度) 优点:比格式化程序更灵活,例如,如果目标宽度是在运行时确定的 缺点:比格式化程序更手动:)
- 确定终端的控制台宽度,并计算沿屏幕右侧实际右对齐文本所需的空间量。这就是
。有几种方法可以解决这个问题,但没有一种是完美的 优点:事实上是对的,看起来很不错 缺点:做对很难,可能会带来更多的麻烦:)控制台宽度-foo.length()-bar.length()
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
这样,左边的名字左对齐(看起来不错),右边的数字右对齐
希望其他人会发现这是有用的!:) 查看文档:可能重复我查看了user1781482发布的问题,但不明白这如何有助于正确证明我的专栏。我也看了格式化程序文档,我不明白如何使用它来实现我想要的,你能进一步解释吗?你能用一个例子来更新这个问题吗?很抱歉!刚刚编辑了这个问题。非常感谢您的详细回答!我将尝试这些解决方案,看看能得到什么。:)
System.out.printf(%-20s %s, lastNameAndFirstName, zipCode);
Baron, Steven 84521
Chill, Robert 63258
Blanthony, Stacy 84815
Wick, John 78412
Yule, Katherine 42136