2009-11-19 22 views

Odpowiedz

9

Macierze Java mają długości na wystąpienie, nie wszystkie tablice w tym samym wymiarze muszą mieć równe długości. Powiedział, że możesz uzyskać długości instancji w.

Wymiary można policzyć po numerze "[" w ich nazwie, jest to szybsze niż zstępowanie w hierarchii typów. Poniższy kod:

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

daje następujący wynik:

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

blisko, ale nadal muszę znać "liczbę" wymiarów, które macie ... –

+0

Widzę, co mówisz. Można utworzyć metodę, która może zostać wywołana z tej klasy, która zwróci liczbę wymiarów. Jeśli nie możesz zmodyfikować tej klasy, nie jestem pewien. – amischiefr

0

Użyj java.lang.reflect.Array.getLength(obj).

+0

ale to daje mi tylko długość tablicy wymiarów ... –

+0

Tablice wielowymiarowe są tablicami tablic. getLength zwróci rzeczywiście rozmiar jednej tablicy, ale teraz znasz rozmiar tablicy zawierającej. Używając pętli od 0 do znalezionej długości - 1, możesz zastosować getLength na każdym elemencie tej pierwszej tablicy i znaleźć inne rozmiary. –

12

Nie ma czegoś takiego jak "długość" dla tablicy wielowymiarowej; może nie być prostokątny. Zgaduję, że mówisz o liczbie wymiarów. Musisz zejść do niego iteracyjnie i liczyć.

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

Najpierw musisz sprawdzić, czy 'Tablica obiektów' jest tablicą. –

+2

Nie, ponieważ pętla while sprawdza dla ciebie - jeśli jest to tablica, metoda po prostu zwróci 0. – skeggse

0

Jeśli lubisz mnie staraliśmy się uzyskać liczbę wymiarów i wielkości nich następnie:

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; 
} 
Powiązane problemy