Java | 配列の文字列表現 練習問題

Java Java
スポンサーリンク

初心者〜中級者が実際に手を動かして学べるよう、練習問題 10 問+模範解答(動くコード例+出力例+短い解説) を作りました。順にやれば Arrays.toString / Arrays.deepToString の理解はバッチリになります。コピペして動かせるように、各問に「解答コード」を書いてあります。


問題1(基礎)

問題int[] nums = {5, 10, 15}; の中身を [5, 10, 15] の形式で出力してください。
ポイント:そのまま System.out.println(nums) としないこと。

解答

import java.util.Arrays;
public class Q1 {
    public static void main(String[] args) {
        int[] nums = {5, 10, 15};
        System.out.println(Arrays.toString(nums));
    }
}
Java

期待出力

[5, 10, 15]

解説:1次元配列は Arrays.toString を使う。


問題2(多次元)

問題:次の 2 次元配列 matrix[[1, 2], [3, 4]] の形式で出力してください。

int[][] matrix = {{1,2},{3,4}};
Java

解答

import java.util.Arrays;
public class Q2 {
    public static void main(String[] args) {
        int[][] matrix = {{1,2},{3,4}};
        System.out.println(Arrays.deepToString(matrix));
    }
}
Java

期待出力

[[1, 2], [3, 4]]

解説:2次元以上は deepToString を使うとネストが展開される。


問題3(toString と deepToString の違いを確認)

問題:次のコードの出力を予想してください(実行例を示す)。

String[] words = {"a","b"};
String[][] pairs = {{"a","b"},{"c","d"}};
System.out.println(Arrays.toString(words));
System.out.println(Arrays.toString(pairs));
System.out.println(Arrays.deepToString(pairs));
Java

解答(出力)

[a, b]
[[Ljava.lang.String;@xxxxxxx, [Ljava.lang.String;@yyyyyyy]
[[a, b], [c, d]]

解説pairsArrays.toString を使うと内側の配列が参照表示になる。deepToString で展開される。


問題4(空配列)

問題:空の int[]new int[0])を表示したときの出力は何か?実際に出力して確認してください。

解答

import java.util.Arrays;
public class Q4 {
    public static void main(String[] args) {
        int[] empty = new int[0];
        System.out.println(Arrays.toString(empty));
    }
}
Java

期待出力

[]

解説:空配列は [] と表示される。


問題5(null の扱い)

問題int[] arr = null; の場合に Arrays.toString(arr) を呼ぶとどうなるか?安全に「null」表示にしたい場合のコードも示してください。

解答(安全に表示する例)

import java.util.Arrays;
public class Q5 {
    public static void main(String[] args) {
        int[] arr = null;
        // 直接呼ぶと NullPointerException になる(回避例)
        System.out.println(arr == null ? "null" : Arrays.toString(arr));
    }
}
Java

期待出力

null

解説Arrays.toString(null) は NPE になる。呼ぶ前に null チェックをする。


問題6(不揃い(ジャグ)配列)

問題:ジャグ配列(行ごとに長さが異なる)を deepToString で出力してみてください。

int[][] jagged = { {1}, {2,3,4}, {} };
Java

解答

import java.util.Arrays;
public class Q6 {
    public static void main(String[] args) {
        int[][] jagged = { {1}, {2,3,4}, {} };
        System.out.println(Arrays.deepToString(jagged));
    }
}
Java

期待出力

[[1], [2, 3, 4], []]

解説deepToString は行ごとの長さが違っても正しく展開する。


問題7(配列の一部だけ表示)

問題:大きな配列 int[] big = {1,2,3,4,5,6,7,8,9,10} の最初の 3 要素だけ [1, 2, 3] として表示するコードを書きなさい。

解答

import java.util.Arrays;
public class Q7 {
    public static void main(String[] args) {
        int[] big = {1,2,3,4,5,6,7,8,9,10};
        int[] head = Arrays.copyOfRange(big, 0, 3); // 0〜2 をコピー
        System.out.println(Arrays.toString(head));
    }
}
Java

期待出力

[1, 2, 3]

解説Arrays.copyOfRange で部分配列を作ってから表示する。


問題8(オブジェクト配列と toString)

問題:次の Person クラス配列を Arrays.toString で出力したときに、人が読める文字列にするには Person に何を実装すべきか?コード例で示しなさい。

class Person {
    String name;
    Person(String n){ name=n; }
}
Person[] people = { new Person("Alice"), new Person("Bob") };
System.out.println(Arrays.toString(people));
Java

解答

import java.util.Arrays;
class Person {
    String name;
    Person(String n){ name=n; }
    @Override
    public String toString(){ return "Person(" + name + ")"; }
}
public class Q8 {
    public static void main(String[] args) {
        Person[] people = { new Person("Alice"), new Person("Bob") };
        System.out.println(Arrays.toString(people));
    }
}
Java

期待出力

[Person(Alice), Person(Bob)]

解説:オブジェクト配列は各要素の toString() を呼ぶ。分かりやすくするにはクラスで toString をオーバーライドする。


問題9(1次元配列に deepToString を使うと…)

問題int[] a = {1}; に対して Arrays.deepToString(a) をそのまま呼べるか?(呼べる or コンパイルエラー or 実行時例外)理由も答えよ。

解答

回答Arrays.deepToString(a) を直接呼すと コンパイルエラー(引数型不一致) になる場合がある。
解説deepToString のシグネチャは public static String deepToString(Object[] a)(配列の配列など Object[])を想定している実装が多い(内部的に instanceof を使うため扱いが異なる)。1次元の基本型配列(int[])は Object ではあるが Object[] ではないため注意が必要。1次元なら Arrays.toString を使うのが正解。

実際の JDK 実装ではオーバーロードなどで対応される事もあるが、安定して使うには toString を選ぶのが無難。


問題10(実践:配列を安全にログ出力するユーティリティを作る)

問題:任意の配列(null もあり得る、1次元〜多次元)を受け取って「安全に」文字列化して返すメソッド safeArrayToString(Object obj) を実装しなさい。(ヒント:obj == null のチェック、obj.getClass().isArray()Arrays.deepToString の活用)

解答例

import java.util.Arrays;

public class Q10 {
    public static void main(String[] args) {
        int[] one = {1,2,3};
        int[][] two = {{1,2},{3,4}};
        Object nothing = null;

        System.out.println(safeArrayToString(one));     // [1, 2, 3]
        System.out.println(safeArrayToString(two));     // [[1, 2], [3, 4]]
        System.out.println(safeArrayToString(nothing)); // null
        System.out.println(safeArrayToString("hello")); // hello (非配列は toString)
    }

    public static String safeArrayToString(Object obj) {
        if (obj == null) return "null";
        Class<?> cls = obj.getClass();
        if (!cls.isArray()) {
            return obj.toString();
        }
        // 配列である。プリミティブ配列も deepToString に渡して扱う(ラップ)
        if (obj instanceof Object[]) {
            return Arrays.deepToString((Object[]) obj);
        } else {
            // 基本型配列(int[], double[] ...)は Arrays.toString のオーバーロードで処理
            if (obj instanceof int[])    return Arrays.toString((int[]) obj);
            if (obj instanceof long[])   return Arrays.toString((long[]) obj);
            if (obj instanceof double[]) return Arrays.toString((double[]) obj);
            if (obj instanceof float[])  return Arrays.toString((float[]) obj);
            if (obj instanceof boolean[])return Arrays.toString((boolean[]) obj);
            if (obj instanceof char[])   return Arrays.toString((char[]) obj);
            if (obj instanceof byte[])   return Arrays.toString((byte[]) obj);
            if (obj instanceof short[])  return Arrays.toString((short[]) obj);
            // 万が一他の型があれば fallback
            return Arrays.deepToString(new Object[]{obj});
        }
    }
}
Java

期待出力(例)

[1, 2, 3]
[[1, 2], [3, 4]]
null
hello

解説isArray() で配列判定し、Object[] とプリミティブ配列を分けて安全に処理している。

Java
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました