【问题标题】:How to right-justify a single column of my console output in Java如何在 Java 中右对齐控制台输出的单列
【发布时间】:2018-02-19 02:10:23
【问题描述】:

我被要求创建一个程序,该程序从文本文件中获取项目并将它们显示在格式为“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

(等)

这是我想要的样子:

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

我在想也许我可以做一些事情,计算从姓氏一直到邮政编码的字符总数,然后从姓氏和邮政编码之间的大量空格中减去,但我是不知道该怎么做,因为它会在字符串和整数之间弹跳。另外,我想有一个更简单的解决方案,我只是不知道。

感谢任何帮助!

谢谢,

冷却液

【问题讨论】:

  • 我查看了 user1781482 发布的问题,但不明白这将如何有助于正确证明我的专栏。还查看了 Formatter 文档,但我不明白如何使用它来实现我想要的,你能进一步解释一下吗?
  • 你能用一个你希望它看起来如何的例子来更新这个问题吗?
  • 对不起!刚刚编辑了问题。

标签: java


【解决方案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

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

希望其他人发现这个有用! :)

【讨论】:

    【解决方案2】:

    有几个选项,取决于您对结果的关心程度以及您正在寻找的行为。

    • 一个简单的选择是仅使用制表符分隔,例如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)。

      缺点:对人来说不一定容易阅读,因为不同宽度的列不会对齐。

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

      好处:右对齐。 这可能就是你想要的。

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

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

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

      缺点:比格式化程序更手动:)

    • 确定终端的控制台宽度,并计算在屏幕右侧实际右对齐文本所需的空间量。那是consoleWidth - foo.length() - bar.length()determine the console width有多种方式,但都不是完美的。

      优点:实际上是右对齐,看起来很不错

      缺点:很难做到正确,可能比它值得的麻烦更多:)

    【讨论】:

    • 非常感谢您的详细解答!我将尝试这些解决方案,看看我能得到什么。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 2020-03-24
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    相关资源
    最近更新 更多