3

将数组的单元格打印为右对齐表格的最佳方法是什么?String[][]例如,输入

{ { "x", "xxx" }, { "yyy", "y" }, { "zz", "zz" } }

应该产生输出

  x xxx
yyy   y
 zz  zz

这似乎是使用应该能够完成的事情java.util.Formatter,但它似乎不允许非常量的字段宽度。最好的答案将使用一些标准方法来填充表格单元格,而不是手动插入空格字符。

4

3 回答 3

6

这是一个答案,对每一列使用动态生成的格式字符串:

public static void printTable(String[][] table) {
  // Find out what the maximum number of columns is in any row
  int maxColumns = 0;
  for (int i = 0; i < table.length; i++) {
    maxColumns = Math.max(table[i].length, maxColumns);
  }

  // Find the maximum length of a string in each column
  int[] lengths = new int[maxColumns];
  for (int i = 0; i < table.length; i++) {
    for (int j = 0; j < table[i].length; j++) {
      lengths[j] = Math.max(table[i][j].length(), lengths[j]);
    }
  }

  // Generate a format string for each column
  String[] formats = new String[lengths.length];
  for (int i = 0; i < lengths.length; i++) {
   formats[i] = "%1$" + lengths[i] + "s" 
       + (i + 1 == lengths.length ? "\n" : " ");
 }

  // Print 'em out
  for (int i = 0; i < table.length; i++) {
    for (int j = 0; j < table[i].length; j++) {
      System.out.printf(formats[j], table[i][j]);
    }
  }
}
于 2008-11-09T00:44:18.183 回答
4

实际上,如果您为字段指定宽度,它应该是右对齐的。
如果您需要动态填充,最长字符串的最小填充,您必须遍历数组,获取最大宽度,生成具有从该最大值计算的宽度的格式字符串,并将其用于格式化输出。

于 2008-11-09T00:01:29.940 回答
1

找到最长字符串的长度..
用空格填充所有字符串,直到它们达到该长度 + 1
System.out.print 它们使用 2 个嵌套的 for 循环

于 2008-11-08T22:56:31.723 回答