2016-09-04 7 views
4

Javaでは、配列が1次元であるかどうかを判断するために、次のような関数を書くにはどうすればよいですか? (コンパイラはarray以来array[i].length一部のネストされた配列として宣言されていないので、これをコンパイルすることを拒否する。)配列が1次元であるかどうかを調べる関数

boolean isOneDimensional(Object[] array) 
{ 
    for (int i=0; i<array.length; i++) 
     if (array[i].length>1) return false; 
    return true; 
} 
+0

また、配列の次元数をランタイムプロパティにする必要があります。 – Raedwald

+0

@ Raedwaldどうすればいいですか? –

答えて

4

あなたは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 
+0

ありがとうT.J.クラウダー。では、最初の条件文( 'if(array.getClass()。getComponentType()。getComponentType()!= null)のみを使用し、ループを完全に省略するとどうなりますか?それもうまくいかないでしょうか? –

+1

@MohammadSanei:これは、上記の 'o3'が' false'(ループが必要)か 'true'(あなたはしない)を返すかどうかによって異なります。 –

+0

しかし、配列が空の多次元配列の場合はどうなりますか?この関数は誤ってtrueを返します。 –

関連する問題