2009-11-19 96 views

回答

9

Java数组具有每个实例的长度,并非同一维中的所有数组都必须具有等于长度。也就是说,你可以得到实例的长度。

尺寸可以通过在他们的名字“[”的数目进行计数,这是比降类型层次结构更快。下面的代码:

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

给出了下面的输出:

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

接近,但仍然必须知道该阵列所具有的“维数”... – 2009-11-19 16:14:33

+0

我明白你的意思了。您可以创建一个可以从该类中调用的方法,该方法将返回维数。如果你不能修改那个班,我不确定。 – amischiefr 2009-11-19 16:23:15

0

使用java.lang.reflect.Array.getLength(obj)

+0

但这只给出了该维数组的长度...... – 2009-11-19 16:09:30

+0

多维数组是数组的数组。 getLength将返回一个数组的大小,但现在你知道包含数组的大小。使用从0到找到的长度-1的循环,可以对第一个数组的每个元素应用getLength,并找出其他大小。 – 2009-11-19 16:20:17

12

有作为“长度”为多维数组没有这样的东西;它可能不是矩形的。我猜你在谈论维度的数量。你需要迭代地下降并计数。

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

您首先必须检查'Object array'是否是一个数组。 – 2010-09-29 11:49:55

+2

你不这样做,因为while循环检查你 - 如果它是一个数组,那么方法将返回0。 – skeggse 2011-12-01 02:25:57

0

如果你喜欢我试图让维数和他们的再大小:

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