LoginSignup
1

More than 5 years have passed since last update.

Arrays#fillメソッドの多次元版の一例

Last updated at Posted at 2016-09-02

一次元配列の初期化をするメソッドがあります。Arraysクラスのfill(boolean[] a, boolean val)等のfill(型名[] a, 型名 val)の形のメソッドが用意されています。このメソッドの多次元配列版の一例を紹介します。

コード

コードは以下です。

多次元版の一例
import java.util.Arrays;

public class ArraysFillEx {

    public static void fill(Object array, Object value) {

        // 第一引数が配列か判定
        Class<?> type = array.getClass();
        if (!type.isArray()) {
            throw new IllegalArgumentException("not array");
        }

        // クラスの型を判定
        String arrayClassName = array.getClass().getSimpleName()
                .replace("[]", "")
                .toLowerCase();
        String valueClassName = value.getClass().getSimpleName()
                .toLowerCase()
                .replace("character", "char")
                .replace("integer", "int");
        if (!arrayClassName.equals(valueClassName)) {
            throw new IllegalArgumentException("does not match");
        }

        // 処理
        if (type.getComponentType().isArray()) {
            for (Object o : (Object[])array) {
                fill(o, value);
            }
        } else if (array instanceof boolean[]) {
                Arrays.fill((boolean[])array, (boolean)value);
        } else if (array instanceof char[]) {
                Arrays.fill((char[])array, (char)value);
        } else if (array instanceof byte[]) {
            Arrays.fill((byte[])array, (byte)value);
        } else if (array instanceof short[]) {
            Arrays.fill((short[])array, (short)value);
        } else if (array instanceof int[]) {
            Arrays.fill((int[])array, (int)value);
        } else if (array instanceof long[]) {
            Arrays.fill((long[])array, (long)value);
        } else if (array instanceof float[]) {
            Arrays.fill((float[])array, (float)value);
        } else if (array instanceof double[]) {
            Arrays.fill((double[])array, (double)value);
        } else {
            Arrays.fill((Object[])array, value);
        }
    }

}

使い方

GitHubのリポジトリにテストコードを載せました。以下はその抜粋です。

使用例
        // int型の例
        int[][][] array = {
                { {1, 2, 3}, {4, 5} },
                { {6, 7, 8}, {9} }
            };

        ArraysFillEx.fill(array, Integer.MAX_VALUE);

        // String型の例
        String[][][] array = {
                { {"a", "b", "c"}, {"d", "e", "f"} },
                { {"g", "h", "i"}, {"j", "k", "l"} }
            };

        ArraysFillEx.fill(array, "zzzz");

@shiracamus さんにコメントをいただきまして、以下の使い方もできることを確認しました。。

使用例
        int[][][] array = new int[3][2][4];
        ArraysFillEx.fill(array, -1);


        String[][][] array = new String[3][2][4];
        ArraysFillEx.fill(array, "Dummy");

ポイント

以下の再帰呼び出しの箇所で、配列の次数を下げてます。第一引数が1次元配列になったら、Arrays#fill()メソッドを使って初期化が完了です。

        if (type.getComponentType().isArray()) {
            for (Object o : (Object[])array) {
                fill(o, value);
            }
        }

1次元になったら、Arrays#fill()メソッドを使って初期化が完了です。

修正履歴

20160903

  • 「使い方」に@shiracamus さんのコメントを反映。
  • @saka1029 さんのコメントを反映。コードを修正。
  • 上記修正に合わせ、「ポイント」を修正。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1