【问题标题】:How to print a table of information in Java如何在 Java 中打印信息表
【发布时间】:2021-06-28 09:33:13
【问题描述】:

我正在尝试用 Java 打印一个表格,但我想知道最好的方法是什么?

我尝试打印新行并使用 \t 使内容对齐,但它不起作用。有没有一种方法可以做到这一点或更好的方法?

【问题讨论】:

  • 用对齐方式查看字符串格式。

标签: java text-alignment


【解决方案1】:

您可以使用System.out.format(...)

例子:

final Object[][] table = new String[4][];
table[0] = new String[] { "foo", "bar", "baz" };
table[1] = new String[] { "bar2", "foo2", "baz2" };
table[2] = new String[] { "baz3", "bar3", "foo3" };
table[3] = new String[] { "foo4", "bar4", "baz4" };

for (final Object[] row : table) {
    System.out.format("%15s%15s%15s%n", row);
}

结果:

        foo            bar            baz
       bar2           foo2           baz2
       baz3           bar3           foo3
       foo4           bar4           baz4

或者使用以下代码进行左对齐输出:

System.out.format("%-15s%-15s%-15s%n", row);

【讨论】:

  • 是否可以对任意数量的元素执行此操作?
  • 抱歉,我不明白你的问题。你能解释得更好吗?
  • 有没有办法让这个而不是右点燃?
  • 当然,使用 System.out.format("%-15s%-15s%-15s\n", row);
  • @corvid - 两年后回答您的问题,给出的示例已经展示了如何打印任意数量的表格元素。循环读取,“对于table 中的row” - 它一直持续到找不到下一个row,因此您不需要确切知道有多少元素。 :)
【解决方案2】:

对数组列表进行表格格式化的通用函数:

public static String formatAsTable(List<List<String>> rows)
{
    int[] maxLengths = new int[rows.get(0).size()];
    for (List<String> row : rows)
    {
        for (int i = 0; i < row.size(); i++)
        {
            maxLengths[i] = Math.max(maxLengths[i], row.get(i).length());
        }
    }

    StringBuilder formatBuilder = new StringBuilder();
    for (int maxLength : maxLengths)
    {
        formatBuilder.append("%-").append(maxLength + 2).append("s");
    }
    String format = formatBuilder.toString();

    StringBuilder result = new StringBuilder();
    for (List<String> row : rows)
    {
        result.append(String.format(format, row.toArray(new String[0]))).append("\n");
    }
    return result.toString();
}

用法:

List<List<String>> rows = new ArrayList<>();
List<String> headers = Arrays.asList("Database", "Maintainer", "First public release date", "Latest stable version", "Latest release date");
rows.add(headers);
rows.add(Arrays.asList("4D (4th Dimension)", "4D S.A.S.", "1984", "v16.0", "2017-01-10"));
rows.add(Arrays.asList("ADABAS", "Software AG", "1970", "8.1", "2013-06"));
rows.add(Arrays.asList("Adaptive Server Enterprise", "SAP AG", "1987", "16.0", "2015"));
rows.add(Arrays.asList("Apache Derby", "Apache", "2004", "10.14.1.0", "2017-10-22"));

System.out.println(formatAsTable(rows));

结果:

Database                    Maintainer   First public release date  Latest stable version  Latest release date  
4D (4th Dimension)          4D S.A.S.    1984                       v16.0                  2017-01-10           
ADABAS                      Software AG  1970                       8.1                    2013-06              
Adaptive Server Enterprise  SAP AG       1987                       16.0                   2015                 
Apache Derby                Apache       2004                       10.14.1.0              2017-10-22    

【讨论】:

    【解决方案3】:

    这是一种方法:

    public class StoreItem {
    
        private String itemName;
        private double price;
        private int quantity;
    
    
        public StoreItem(String itemName, double price, int quantity) {
            this.setItemName(itemName);
            this.setPrice(price);
            this.setQuantity(quantity);
        }
    
    
        public String getItemName() {
            return itemName;
        }
    
        public void setItemName(String itemName) {
            this.itemName = itemName;
        }
    
        public double getPrice() {
            return price;
        }
    
        public void setPrice(double price) {
            this.price = price;
        }
    
        public int getQuantity() {
            return quantity;
        }
    
        public void setQuantity(int quantity) {
            this.quantity = quantity;
        }
    
    
        public static void printInvoiceHeader() {
            System.out.println(String.format("%30s %25s %10s %25s %10s", "Item", "|", "Price($)", "|", "Qty"));
            System.out.println(String.format("%s", "----------------------------------------------------------------------------------------------------------------"));
        }
        public void printInvoice() {
            System.out.println(String.format("%30s %25s %10.2f %25s %10s", this.getItemName(), "|", this.getPrice(), "|", this.getQuantity()));
        }
    
        public static List<StoreItem> buildInvoice() {
            List<StoreItem> itemList = new ArrayList<>();
            itemList.add(new StoreItem("Nestle Decaff Coffee", 759.99, 2));
            itemList.add(new StoreItem("Brown's Soft Tissue Paper", 15.80, 2));
            itemList.add(new StoreItem("LG 500Mb External Drive", 700.00, 2));
            return itemList;
        }
    
        public static void main (String[] args) {
    
            StoreItem.printInvoiceHeader();
            StoreItem.buildInvoice().forEach(StoreItem::printInvoice);
         }
    }
    

    输出:

    【讨论】:

      【解决方案4】:

      编写一个函数,用空格将字符串填充到所需的列长度。这可以是一个静态助手,您可以创建一个 StrUtils 类或类似的类来保存它。

      (也可能有 Apache 或其他带有字符串助手/实用程序的库来为您执行此操作。)

      长期而言,如果您要输出表格数据,您可以考虑导出 CSV(用于 Excel 等)或 XML。但这些是针对典型的长期业务需求,而不仅仅是快速筛选输出。

      【讨论】:

      • 好的,谢谢你的帮助,我会看看一些字符串函数
      【解决方案5】:

      我认为使用J-Text-Utils 为您输出表格会是一种方便的方式。通过这个小型库,您无需重新发明轮子。您只需输入您的数据,它会为您处理格式。

      这是他们Google Code site的一个例子:

      String[] columnNames = {
      "First Name",
      "Last Name",
      "Sport",
      "# of Years",
      "Vegetarian"};
      
      Object[][] data = {
      {"Kathy", "Smith",
      "Snowboarding", new Integer(5), new Boolean(false)},
      {"John", "Doe",
      "Rowing", new Integer(3), new Boolean(true)},
      {"Sue", "Black",
      "Knitting", new Integer(2), new Boolean(false)},
      {"Jane", "White",
      "Speed reading", new Integer(20), new Boolean(true)}, {"Joe", "Brown",
      "Pool", new Integer(10), new Boolean(false)}
      };
      
      TextTable tt = new TextTable(columnNames, data);
      // this adds the numbering on the left
      tt.setAddRowNumbering(true);
      // sort by the first column
      tt.setSort(0);
      tt.printTable();
      

      输出:

      【讨论】:

        【解决方案6】:

        有一个很小的库,可以打印 Markdown 格式的表格: https://github.com/mjfryc/mjaron-etudes-java

        • 它接受任何包含“记录”和迭代类型类的Iterable
        • 遍历类中的所有公共和私有字段。
        • 它期望:
          • 字段是公开的
            public String something;
          • 字段是私有的,但有公共 getter 方法
            public String getSomething();
            • 如果类型是 boolean,它可能以 has 开头:
              public boolean hasSomething();
        import pl.mjaron.etudes.Obj;
        ...
        List<Cat> cats = Arrays.asList(cat0, cat1);
        String table = Obj.asTable(cats, Cat.class);
        

        样本输出:

        | name | legsCount |  lazy | topSpeed |
        | ---- | --------- | ----- | -------- |
        | John |         4 |  true |    35.24 |
        |  Bob |         5 | false |     75.0 |
        

        PS 我是这个库的作者,享受吧。

        【讨论】:

          猜你喜欢
          • 2017-05-29
          • 1970-01-01
          • 2010-10-21
          • 1970-01-01
          • 1970-01-01
          • 2018-04-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多