【问题标题】:sparse matrix alignment稀疏矩阵对齐
【发布时间】:2013-03-09 11:11:08
【问题描述】:
有没有办法在我的稀疏矩阵中对齐这些值?
0 0 0 0 8 2
0 0 0 19 11 0
0 11 0 13 0 0
0 18 0 0 7 0
0 0 0 0 4 0
0 0 3 0 0 0
目前我有这个:
if (matrix[i][j] < 20)
System.out.print(matrix[i][j] + " ");
else
System.out.print(" " + 0 + " ");
我遇到的问题是,如果值介于 1 和 9 之间,那么值之前就没有空格,因此会打乱我的对齐方式。我可以插入另一个 if 语句,但想知道是否有更简单/更清洁的方法?
任何帮助将不胜感激,谢谢
【问题讨论】:
标签:
java
matrix
alignment
sparse-matrix
【解决方案1】:
我在处理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列对齐
- 打印矩阵