2009-11-19 3 views

Répondre

9

Les tableaux Java ont des longueurs par instance, tous les tableaux de la même dimension ne doivent pas avoir des longueurs égales. Cela dit, vous pouvez obtenir la longueur des instances dans le.

Les dimensions peuvent être comptées par le nombre de '[' dans leur nom, c'est plus rapide que de descendre la hiérarchie de type. Le code suivant:

 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); 
      } 
     } 

donne le résultat suivant:

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

près, mais encore faut-il connaître le "nombre" de dimensions que le tableau a ... –

+0

Je vois ce que vous dites. Vous pouvez créer une méthode pouvant être invoquée à partir de cette classe qui renverra le nombre de dimensions. Si vous ne pouvez pas modifier cette classe, je ne suis pas sûr. – amischiefr

0

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

+0

mais cela me donne la longueur de ce tableau de dimension seulement ... –

+0

Les tableaux multidimensionnels sont des tableaux de tableaux. getLength retournera en effet la taille d'un tableau, mais vous connaissez maintenant la taille du tableau contenant. En utilisant une boucle de 0 à la longueur trouvée - 1, vous pouvez appliquer getLength sur chaque élément de ce premier tableau et trouver les autres tailles. –

12

Il n'y a pas de "longueur" pour un tableau multidimensionnel; Ce n'est peut-être pas rectangulaire. Je suppose que vous parlez du nombre de dimensions. Vous devez y descendre itérativement et compter.

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

Vous devez d'abord vérifier si 'Object array' est un tableau. –

+2

Ce n'est pas le cas, car la boucle while vérifie pour vous - s'il s'agit d'un tableau, la méthode retournera simplement 0. – skeggse

0

Si vous me voulez essayions d'obtenir le nombre de dimensions et de la taille d'entre eux alors:

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; 
}