配列の可視化(ASCII 表示)とは?
2次元配列を 「表(テーブル)」 のようにして、
+----+----+----+
| 87 | 54 | 67 |
+----+----+----+
| 76 | 92 | 48 |
+----+----+----+
のように表示する方式です。
文字だけで“表”が見えるので、デバッグにも便利です。
仕組み(簡単なイメージ)
- 行の上に「横罫線」を引く
- 各要素を
"| 値 "のように囲って並べる - 行を閉じるときにまた横罫線を引く
最も簡単なバージョン(固定幅)
まずは簡単な 5 行ほどのコードで表を表示する例です。
サンプルコード(初心者向け)
int[][] a = { {87, 54, 67}, {76, 92, 48} };
for (int i = 0; i < a.length; i++) {
System.out.println("+----+----+----+"); // 枠線
for (int j = 0; j < a[i].length; j++) {
System.out.print("| " + a[i][j] + " ");
}
System.out.println("|"); // 行の最後を閉じる
}
System.out.println("+----+----+----+");
Java出力結果
+----+----+----+
| 87 | 54 | 67 |
+----+----+----+
| 76 | 92 | 48 |
+----+----+----+
固定幅のため、値が2桁前提ですが、見た目は簡単でわかりやすいです。
レベルアップ版:幅を自動調整する「汎用 ASCII テーブル表示メソッド」
値の桁数に合わせて列幅を自動調整する、実用的な方法を紹介します。
完全コード
public class AsciiTable {
public static void printTable(int[][] table) {
// 1. 各列の最大幅を調べる
int cols = table[0].length;
int[] colWidths = new int[cols];
for (int j = 0; j < cols; j++) {
int max = 0;
for (int i = 0; i < table.length; i++) {
int len = String.valueOf(table[i][j]).length();
if (len > max) max = len;
}
colWidths[j] = max;
}
// 2. 横線を作る関数(ラムダ式)
Runnable printLine = () -> {
for (int w : colWidths) {
System.out.print("+");
for (int k = 0; k < w + 2; k++) System.out.print("-");
}
System.out.println("+");
};
// 3. 表の出力
for (int i = 0; i < table.length; i++) {
printLine.run(); // 行の上の線
for (int j = 0; j < cols; j++) {
String value = String.valueOf(table[i][j]);
System.out.print("| " + padRight(value, colWidths[j]) + " ");
}
System.out.println("|");
}
printLine.run(); // 最後の線
}
// 右にスペースを入れて幅を揃える
private static String padRight(String s, int width) {
StringBuilder sb = new StringBuilder(s);
while (sb.length() < width) sb.append(" ");
return sb.toString();
}
// 動作確認用 main
public static void main(String[] args) {
int[][] nums = {
{1, 200, 3},
{4567, 8, 90},
{12, 345, 6789}
};
printTable(nums);
}
}
Java出力結果
+------+-----+------+
| 1 | 200 | 3 |
+------+-----+------+
| 4567 | 8 | 90 |
+------+-----+------+
| 12 | 345 | 6789 |
+------+-----+------+
どんな桁数でもキレイに整列します。
ジャグ配列(列数がバラバラ)にも対応させたい?
もし必要なら、次のような配列にも対応可能です:
int[][] a = {
{1},
{10, 20, 30},
{7, 8}
};
Java要望があれば、列数が行ごとに違う配列にも対応する汎用版 を作ります。
おまけ:超コンパクト版(ワンメソッド)
static void simpleAscii(int[][] t) {
for (int[] row : t) {
System.out.println("+----------------------------+");
System.out.print("| ");
for (int v : row) System.out.print(v + " ");
System.out.println("|");
}
System.out.println("+----------------------------+");
}
