努力打印格式化的记忆表

问题描述 投票:0回答:1

我需要打印一个格式如下的记忆表:

                                       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 computer-science
1个回答
0
投票

“...我正在努力打印括号中的值而不扭曲其他数据。...”

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

我已将 1 添加到 w,以提供额外的 space 字符,用于填充。

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 = 1; 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;
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 = 1; 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();
Formatter 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
                          {}   515  5687  1420  2988   295 10545  1656  8904 10640 10305
                         {1}   547  3182  9120  1319   775  7453  5053 11888  5721   441
                      {1, 2}   126 11269 11952  9638  6421 11735  8164 10422  2606 12154
                   {1, 2, 3}  3072  9548  6967  2940 11316  8941   325  5450  4467 11151
                {1, 2, 3, 4}  4249   527 11819  6788  1801  6863  4847  2698  1859  4063
             {1, 2, 3, 4, 5}  8371  6456  6676  3513  7506 10134  3425  6085  2033  7580
          {1, 2, 3, 4, 5, 6}  9693  4336  5104  2678 10067   137  1600 10323  5223 12080
       {1, 2, 3, 4, 5, 6, 7} 12130  7568 10192  8772  6523  8294  4427  3018  1171  3148
    {1, 2, 3, 4, 5, 6, 7, 8}  7645  4081 10049 12259  5070 11315  9601  9500 11733  2753
 {1, 2, 3, 4, 5, 6, 7, 8, 9}  4175  8927  4011  6547 10221  9413  7206  6822  7719  2004
© www.soinside.com 2019 - 2024. All rights reserved.