我在处理la4j(Java 的线性代数)时正在解决类似的任务。la4j 使用覆盖toString()
方法来满足此需求。因此,我决定使用慢速(因为控制台输出在调试模式下使用主输出,并且 la4j 具有快速有效的发布版本流)但安全的算法。这是代码(precision
分隔符后的位数):
@Override
public String toString() {
final int precision = 3;
int formats[] = new int[columns];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
long value = (long) unsafe_get(i, j);
int size = Long.toString(value).length() + precision + 2;
formats[j] = size > formats[j] ? size : formats[j];
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
sb.append(String.format("%" + Integer.toString(formats[j])
+ "." + precision + "f", unsafe_get(i, j)));
}
sb.append("\n");
}
return sb.toString();
}
所以,算法有两个步骤:
- 将数组计算
formats
为需要打印i
列对齐的字符数
- 打印矩阵