【问题标题】: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 语句,但想知道是否有更简单/更清洁的方法?

任何帮助将不胜感激,谢谢

【问题讨论】:

  • 看看String.format能为你做什么。

标签: 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();
}

所以,算法有两个步骤:

  1. 计算formats数组作为需要的字符数 打印i列对齐
  2. 打印矩阵

【讨论】:

    猜你喜欢
    • 2012-01-10
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多