1

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

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

有什么聪明的方法可以做到这一点吗?

非常感谢。

4

3 回答 3

1

如果数据已经在内存中读取并且我们可以离线使用它们:意味着数据本质上不是一个一个出现,或者如果是这样,可以将它们存储在一个表中:一个二维数组,如数据结构或集合事先使用:

  1. 我们可以尝试计算每列的最大宽度
  2. 然后使用最大宽度作为格式化标志:"%"+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);
        }

示例输出将是:

Id   Vehicle   Disance   
1    ByCycle   2 km      
2    Car       10 km     
3    Van       6.5 km   
于 2013-11-12T18:52:38.233 回答
1

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

但是要继续您的工作方式,请尝试两件事:

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
于 2013-11-12T18:03:41.520 回答
0

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

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

于 2013-11-12T17:47:24.310 回答