8
votes

Longueur multi-dimensions Réflexion Java

Comment puis-je trouver la longueur d'une matrice multidimensionnelle avec réflexion sur Java?


0 commentaires

5 Réponses :


0
votes
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);

1 commentaires

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



0
votes

Utiliser java.lang.reflect.array.getlength (obj) .


1 commentaires

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



14
votes

Il n'y a pas de "longueur" pour une matrice multidimensionnelle; Il peut ne pas être rectangulaire. Je suppose que vous parlez du nombre de dimensions. Vous devez descendre de manière itérative et compter.

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


2 commentaires

Vous devez d'abord vérifier si Array d'objet est un tableau.


Vous ne le faites pas, car la boucle tandis que la boucle vérifie pour vous - s'il s'agit d'une matrice, la méthode va simplement renvoyer 0.



10
votes

Les matrices Java ont des longueurs par instance, toutes les tableaux dans la même dimension doivent avoir des longueurs égales. Cela dit, vous pouvez obtenir les longueurs des instances dans la.

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

donne la sortie suivante: xxx


0 commentaires

-1
votes

Si vous aimez que j'ai essayé d'obtenir le nombre de dimensions et de la taille d'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;
} 


0 commentaires