我需要打印一个格式如下的记忆表:
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");
}
}
有人有什么建议吗?谢谢!
“...我正在努力打印括号中的值而不扭曲其他数据。...”
首先获取初始列和每个后续列的宽度值。
我已将 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++;
从这里打印格式化的值。
我建议使用 Formatter 和 StringBuilder 类。
这是完整的代码。
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