难以打印格式化的记忆表

Struggling to print formatted memoization table

提问人:Nancy Drake 提问时间:11/16/2023 更新时间:11/16/2023 访问量:25

问:

我需要打印一个格式如下的备忘录表:

                                       Weights -->
                        0       1       2       3       4       5       6

            {}          0       0       0       0       0       0       0       
           {1}          0       0       0       0       0       6       6       
        {1, 2}          0       0      18      18      18      18      18       
     {1, 2, 3}          0       2      18      20      20      20      20       

但是我正在努力在不扭曲其他数据的情况下打印括号中的值。这是我到目前为止所拥有的:

public static void printTable(int M[][], int n, int row, int W) {
      System.out.println("\nMemoization table, Row " + row + " completed");
      System.out.println("\t\t\tWeights -->");
      for (int i = 0; i <= W; i++) {
         System.out.printf("%8d", i);
      }
      System.out.println("\n------------------------------------------------------------------------------------");
      
      for (int i = 0; i < M.length; i++) {
         
         if (i == 0) {
            System.out.printf("{}");
         }
         else {
            System.out.printf("{");
            for (int j = 1; j <= i; j++) {
               System.out.print(j);
               if (j < i) {
                  System.out.print(", ");
               }
            }
            System.out.printf("}");
               
            
         }
         
         for (int j = 0; j < M[i].length; j++) {
            System.out.printf("%8d", M[i][j]);
         
         }
         System.out.print("\n");
      
      }
   
   }

有人有什么建议吗?谢谢!

Java 计算机科学

评论


答:

0赞 Reilas 11/16/2023 #1

"...我正在努力在不扭曲其他数据的情况下打印括号中的值。..."

首先获取初始列的宽度值,然后获取每个后续列的宽度值。

我向 wawb 添加了 1,以提供额外的空格字符用于填充。

int wa, wb, n = M.length, m, i, j;
StringBuilder s = new StringBuilder();
for (i = 1; i < n; i++) {
    if (i != 1) s.append(", ");
    s.append(i);
}
s.insert(0, '{').append('}');
wa = s.length() + 1;
wb = String.valueOf(M[0][0]).length();
for (i = 0; i < n; i++)
    for (j = 0, m = M[i].length; j < m; j++)
        if (String.valueOf(M[i][j]).length() > wb)
            wb = String.valueOf(M[i][j]).length();
wb++;

从这里,打印格式化的值。
我建议使用 FormatterStringBuilder 类。

这是完整的代码。

int wa, wb, n = M.length, m, i, j;
StringBuilder s = new StringBuilder(), b;
Formatter f;
String fa, fb;
for (i = 1; i < n; i++) {
    if (i != 1) s.append(", ");
    s.append(i);
}
s.insert(0, '{').append('}');
wa = s.length() + 1;
wb = String.valueOf(M[0][0]).length();
for (i = 0; i < n; i++)
    for (j = 0, m = M[i].length; j < m; j++)
        if (String.valueOf(M[i][j]).length() > wb)
            wb = String.valueOf(M[i][j]).length();
wb++;
fa = "%" + wa + "s";
fb = "%" + wb + "s";
s = new StringBuilder();
f = new Formatter(s);
for (i = 0; i < n; i++) {
    b = new StringBuilder();
    for (j = 0; j < i; j++) {
        if (j != 0) b.append(", ");
        b.append(j + 1);
    }
    b.insert(0, '{').append('}');
    f.format(fa, b);
    for (j = 0, m = M[i].length; j < m; j++)
        f.format(fb, M[i][j]);
    f.format("%n");
}
f.flush();
System.out.println(s);

输出

        {}  0  0  0  0  0  0  0
       {1}  0  0  0  0  0  6  6
    {1, 2}  0  0 18 18 18 18 18
 {1, 2, 3}  0  2 18 20 20 20 20
                          {}   85 4546    5   47 8257   20 7869   42 9963    6
                         {1} 9736   45    3 2767   81 7119   39   61   65   83
                      {1, 2}   94   34   30   53   76   36 9311   66    7   45
                   {1, 2, 3} 8066    3 6553   99   45   14   99 3033 6160   92
                {1, 2, 3, 4}   27 7815   25   21   50   45   29   14   22 8384
             {1, 2, 3, 4, 5}   33   61 6040   47   50 6579   63   98    0  357
          {1, 2, 3, 4, 5, 6} 3343   98   96   87 4915   23 9565   27   27   96
       {1, 2, 3, 4, 5, 6, 7}   10   46    1 6935   54   58   15 5089   26   22
    {1, 2, 3, 4, 5, 6, 7, 8}   47 4313   78 7733   13 3326 8399   82   21   48
 {1, 2, 3, 4, 5, 6, 7, 8, 9}   77 9160   45   98   59   63   51   27 1078 7585