2009-11-19 19 views

Respuesta

9

Las matrices de Java tienen longitudes por instancia, no todas las matrices en la misma dimensión tienen que tener longitudes iguales. Dicho esto, puedes obtener la longitud de instancias en el.

Las dimensiones se pueden contar por el número de '[' en su nombre, esto es más rápido que descender la jerarquía de tipos. El siguiente código:

 int[][][] ary = {{{0},{1}}}; 

     Class cls = ary.getClass(); 

     boolean isAry = cls.isArray(); 
     String clsName = cls.getName(); 

     System.out.println("is array=" + isAry); 
     System.out.println("name=" + clsName); 

     int nrDims = 1 + clsName.lastIndexOf('['); 

     System.out.println("nrDims=" + nrDims); 

     Object orly = ary; 

     for (int n = 0; n < nrDims; n++) { 

      int len = Array.getLength(orly); 

      System.out.println("dim[" + n + "]=" + len); 

      if (0 < len) { 
       orly = Array.get(orly, 0); 
      } 
     } 

da el siguiente resultado:

is array=true 
name=[[[I 
nrDims=3 
dim[0]=1 
dim[1]=2 
dim[2]=1 
0
Class clazz = Class.forName("ReflectionTest");  
Method m = clazz.getDeclaredMethod("getArray"); 
Object o1 = m.invoke(o, arg); 
int array[][] = (int[][])o1; 
System.out.println("Array length: " + array.length); 
System.out.println("Array length: " + array[0].length); 
+0

estrecha, pero aún debe saber el "número" de dimensiones que tiene la matriz ... –

+0

Veo lo que dice. Puede crear un método que pueda invocarse desde esa clase que devolverá el número de dimensiones. Si no puedes modificar esa clase, no estoy seguro. – amischiefr

0

Usar java.lang.reflect.Array.getLength(obj).

+0

pero eso me da la longitud de esa matriz de dimensiones solamente ... –

+0

Las matrices multidimensionales son matrices de matrices. getLength devolverá de hecho el tamaño de una matriz, pero ahora usted sabe el tamaño de la matriz que lo contiene. Usando un bucle de 0 a longitud de búsqueda - 1, puede aplicar getLength en cada elemento de esa primera matriz y averiguar los otros tamaños. –

12

No existe la "longitud" para la matriz multidimensional; puede no ser rectangular Supongo que estás hablando de la cantidad de dimensiones. Necesitas descender a ella iterativamente y contar.

public int getDimensionCount(Object array) { 
    int count = 0; 
    Class arrayClass = array.getClass(); 
    while (arrayClass.isArray()) { 
    count++; 
    arrayClass = arrayClass.getComponentType(); 
    } 
    return count; 
} 
+0

Primero tiene que comprobar si 'Object array' es una matriz. –

+2

No, porque el ciclo while busca por usted; si es una matriz, el método simplemente devolverá 0. – skeggse

0

Si te gusta me estaban tratando de obtener el número de dimensiones y el tamaño de ellos a continuación:

private static int[] getDimentionsOf(final Object expectedArray) { 
    if (!expectedArray.getClass().isArray()) { 
     return new int[0]; 
    } 
    final int dimensionSize = Array.getLength(expectedArray); 
    final int[] innerDimensions = 
        (expectedArray.getClass().getComponentType().isArray()) 
            ? getDimentionsOf(Array.get(expectedArray, 0)) 
            : new int[0]; 
    final int lenghtPlusOne = innerDimensions.length + 1; 
    final int[] newDimensions = new int[lenghtPlusOne]; 
    System.arraycopy(innerDimensions, 0, newDimensions, 1, innerDimensions.length); 
    newDimensions[0] = dimensionSize; 
    return newDimensions; 
}