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