如何像表格一样格式化java输出

如何像表格一样格式化java输出,java,formatting,Java,Formatting,我有一个数据结构,我想像表格一样打印在输出上 我使用了System.Outprintf方法,但是效果不好 System.out.printf("%4s %-7s %-4s %-7s%n", "node", "node Ip", "Type", "subType"); System.out.printf("%2d %-7s %-12s %-21s%n", node.getNodeKey(), node.getNodeIpAddress(),

我有一个数据结构,我想像表格一样打印在输出上

我使用了
System.Out
printf
方法,但是效果不好

System.out.printf("%4s  %-7s   %-4s   %-7s%n", "node", "node Ip", "Type", "subType");
System.out.printf("%2d  %-7s   %-12s   %-21s%n", node.getNodeKey(),
              node.getNodeIpAddress(), 
              node.getNodeType(), 
              node.getNodeSubType());
结果是:

node  node Ip   Type   subType
 2  10.1.1.2   NODETYPE_WDM   NODESUBTYPE_RROADM_2 
 0            NODETYPE_NONE   NODESUBTYPE_NONE 
有什么聪明的方法可以做好这件事吗


非常感谢。

最直接的方法是使用制表符“\t”。但是,如果任何打印字符串的长度大于tab,则不能保证此操作有效。此外,选项卡的宽度取决于许多因素


完成所需内容的最佳方法是检查每列的最大宽度,并根据需要添加空格字符,以使布局美观。

我认为这取决于您所说的“智能”是什么意思

但要继续这样做,请尝试两件事:

1) Header row field widths must be the same size as data row widths; and
2) You'll want them to be big enough.
这说明了我的意思:

  public void printLineImproved (int node, String nodeIp, String nodeType, String nodeSubtype) {
    System.out.printf("%4s  %-12s   %-12s   %-21s%n", "node", "node Ip", "Type", "subType");
    System.out.printf("%4d  %-12s   %-12s   %-21s%n", node, nodeIp, nodeType, nodeSubtype);
  }
其输出为:

node  node Ip        Type           subType              
   2  10.1.1.2       NODETYPE_WDM   NODESUBTYHPE_RROADM_2

如果数据已经在内存中读取,并且我们可以脱机使用它们:意味着数据基本上不是逐个显示的,或者如果是这样,可以将它们存储在表中:一个类似于2D数组的数据结构或集合,以便在手前使用:

  • 我们可以尝试计算每列的最大宽度
  • 然后使用最大宽度作为格式化标志:
    “%”+maxWidth[col]+“s”
    我为您提供一个简短的工作示例:

    String data[][] = { {"Id", "Vehicle", "Disance" },
                        {"1", "ByCycle", "2 km"}, 
                        {"2", "Car", "10 km"}, 
                        {"3", "Van", "6.5 km"} 
                      };
    
            int col = data[0].length;
            int row = data.length;
    
            int maxWidth[] = new int[col];
    
            for(String[] rowD : data)
             for(int i=0; i< col; i++)
             {
                 if(maxWidth[i] < rowD[i].length())
                     maxWidth[i] = rowD[i].length();
             }
    
            String format = "";
    
            for(int x:maxWidth)
                format += "%-"+(x+2)+"s ";
    
            format +="%n";
    
            for(String[] rowD : data)
            {
                System.out.printf(format, rowD);
            }
    

    当我说smart时,我指的是比我的解决方案更通用、更自动化的解决方案。例如,不要格式化所有列的大小。因为我有很多数据,并且列举了一些可能的值。@M4tt3是的,有这样的解决方案。Sage的回答解决了这个问题。我的刚修复了你们的宽度错误。你们的示例代码似乎有一些问题-1。
    整数变量似乎未使用。2.for循环条件中的间距存在一些不一致。3.数据中有一些拼写错误-“ByCycle”应该是“Bicycle”,而“Disance”应该是“Distance”
    Id   Vehicle   Disance   
    1    ByCycle   2 km      
    2    Car       10 km     
    3    Van       6.5 km