あなたはgetClass
経由エントリのClass
を取得し、それが配列だ場合、そのクラスを尋ねますisArray
経由のタイプ:
boolean isOneDimensional(Object[] array)
{
// Assuming you want an NPE if `array` is `null`, so not checking
for (int i=0; i<array.length; i++)
if (array[i] != null && array[i].getClass().isArray()) return false;
return true;
}
は、念のために、null
チェックに注意してください。
いや、私の悪い、上記と間違った結果が得られます。
isOneDimensional(new String[2][])
だから、基本的に、我々が扱うことができ、物事の二種類があります。本当にObject[]
で作成されたオブジェクトは、とそのコンテンツに応じて1次元または多次元であってもよく、またはObject[]
以外のもので作成されたオブジェクト(例えば、上記のnew String[2][]
など)であってもよい。
上記のループバージョンを使用して最初のケースを検出できます。しかし、最初に、我々はarray.getClass().getComponentType().getComponentType()
を使用して、第2のケースを確認してください:
boolean isOneDimensional(Object[] array) {
// Assuming you want an NPE if `array` is `null`, so not checking
if (array.getClass().getComponentType().getComponentType() != null) {
return false;
}
for (int i=0; i<array.length; i++) {
if (array[i] != null && array[i].getClass().isArray()) {
return false;
}
}
return true;
}
私たちはObject[]
と代入互換何かを見ているので、それは間違いなく成分を有するように、第1 getComponentType
は、null
非戻ってくることを知っていますタイプ。したがって、にはタイプのコンポーネントタイプがあり、配列タイプであるとわかっている場合は、ループはまったく必要ありません。
String[] o1 = new String[2]; // Yes, it's one-dimensional
String[][] o2 = new String[2][]; // No, it isn't
Object[] o3 = new Object[2]; // It may or may not be, depending on contents
Object[] o4 = new Object[2]; // It may or may not be, depending on contents
// This makes `o3` multi-dimensional
o3[0] = new Object[0];
System.out.println(isOneDimensional(o1)); // true
System.out.println(isOneDimensional(o2)); // false
System.out.println(isOneDimensional(o3)); // false
System.out.println(isOneDimensional(o4)); // true
また、配列の次元数をランタイムプロパティにする必要があります。 – Raedwald
@ Raedwaldどうすればいいですか? –