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();
}
したがって、アルゴリズムには 2 つのステップがあります。
- 列を揃え
formats
て印刷する必要がある文字数として配列を計算しますi
- マトリックスを印刷する