2009-11-19 37 views

Trả lời

9

Mảng Java có độ dài mỗi trường hợp, không phải tất cả các mảng trong cùng một tham số đều phải có độ dài bằng nhau. Điều đó nói rằng, bạn có thể nhận được độ dài của các thể hiện trong.

Thứ nguyên có thể được tính bằng số '[' trong tên của chúng, điều này nhanh hơn giảm dần phân cấp loại. Các mã sau đây:

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

cho đầu ra sau đây:

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

gần, nhưng vẫn phải biết "số" của các kích thước mà mảng có ... –

+0

Tôi thấy những gì bạn đang nói. Bạn có thể tạo một phương thức có thể được gọi ra từ lớp đó sẽ trả về số thứ nguyên. Nếu bạn không thể sửa đổi lớp đó, tôi không chắc chắn. – amischiefr

0

Sử dụng java.lang.reflect.Array.getLength(obj).

+0

nhưng điều đó mang lại cho tôi độ dài của mảng thứ nguyên đó ... –

+0

Mảng đa chiều là mảng của mảng. getLength sẽ trả về kích thước thực của một mảng, nhưng bây giờ bạn biết kích thước của mảng chứa. Sử dụng một vòng lặp từ 0 đến độ dài tìm thấy - 1, bạn có thể áp dụng getLength trên mỗi phần tử của mảng đầu tiên đó và tìm ra các kích thước khác. –

12

Không có thứ gì như "độ dài" cho mảng đa chiều; nó có thể không phải là hình chữ nhật. Tôi đoán bạn đang nói về số lượng kích thước. Bạn cần phải đi vào nó lặp đi lặp lại và đếm.

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

Trước tiên bạn phải kiểm tra xem 'mảng đối tượng' có phải là một mảng hay không. –

+2

Bạn không, vì vòng lặp while kiểm tra cho bạn - nếu nó là một mảng, phương thức sẽ trả về 0. – skeggse

0

Nếu bạn thích tôi đã cố gắng để có được số lượng kích thước và kích thước của chúng thì:

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