如何在Java中对控制台输出的单个列进行右对齐

如何在Java中对控制台输出的单个列进行右对齐,java,Java,我被要求创建一个程序,从一个文本文件中提取项目,并将它们显示在一个格式为“LastName,FirstName ZipCode”的列表中,其中邮政编码都在右侧对齐,姓氏和姓氏之间仅用逗号和空格分隔 我把所有的东西都列出来没有问题,我遇到的唯一问题就是对齐邮政编码 目前,这是我为输出格式编写的内容: System.out.printf("%s, %s %s\n", fileList.get(lastName), fileList.get(i), fileList.get(zipCode)); 我

我被要求创建一个程序,从一个文本文件中提取项目,并将它们显示在一个格式为“LastName,FirstName 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]
    来支持正确对齐,例如
    System.out.printf(“%s%10s\n”,foo,bar)
    将确保字段宽度至少为10个字符。如果您事先知道字段的最大宽度,或者能够首先传递数据以计算它,则此操作非常有效

    好处:正确解释。这可能是您想要的。

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

  • 使用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