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

  • 0
    いいね
  • 4
    コメント

    一次元配列の初期化をするメソッドがあります。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 さんのコメントを反映。コードを修正。
    • 上記修正に合わせ、「ポイント」を修正。