提问人:Nancy Drake 提问时间:11/16/2023 更新时间:11/16/2023 访问量:25
难以打印格式化的记忆表
Struggling to print formatted memoization table
问:
我需要打印一个格式如下的备忘录表:
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");
}
}
有人有什么建议吗?谢谢!
答:
0赞
Reilas
11/16/2023
#1
"...我正在努力在不扭曲其他数据的情况下打印括号中的值。..."
首先获取初始列的宽度值,然后获取每个后续列的宽度值。
我向 wa 和 wb 添加了 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++;
从这里,打印格式化的值。
我建议使用 Formatter 和 StringBuilder 类。
这是完整的代码。
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
评论