我有一个数据结构,我想像输出表一样在输出上打印。
我使用了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
有没有聪明的方法可以做到这一点?
非常感谢。
答案 0 :(得分:1)
这取决于你的意思“smart”,我认为。
但要继续你的方式,尝试两件事:
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
答案 1 :(得分:1)
如果数据已经在内存中读取并且我们可以脱机使用它们:意味着数据实际上并不是逐个出现,或者如果是这样,就可以将它们存储在表中:像数据结构这样的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);
}
示例输出将为:
Id Vehicle Disance
1 ByCycle 2 km
2 Car 10 km
3 Van 6.5 km
答案 2 :(得分:0)
最直接的方法是使用制表符“\ t”。但是,如果任何打印字符串的长度大于制表符,则无法保证此功能。此外,标签的宽度取决于许多因素。
完成所需操作的最佳方法是检查每列的最大宽度,并根据需要添加空格字符,以使布局美观。