Java中的可变维数组?

9
switch (dimensions) {
    case 1:  double[] array = new double[10];                     break;
    case 2:  double[][] array = new double[10][];                 break;
    case 3:  double[][][] array =  new double[10][][];            break;
    case 4:  double[][][][] array = new double[10][][][];         break;
    case 5:  double[][][][][] array = new double[10][][][][];     break;
    case 6:  double[][][][][][] array = new double[10][][][][][]; break;
    default: System.out.println("Sorry, too many dimensions");    break;
}

有没有更好的方法来完成上述操作?我希望它能够创建任意维度的数组,而且...

2个回答

9

我建议使用一维数组,并根据维度 i 和 j 进行索引。


1
我认为有必要使用原始数组,而不是编写一个抽象层覆盖它,从而创建“任意数量维度”的范例并隐藏实际存储。但这可能取决于实际的使用模式。 - Romain
2
多维数组并不实用,特别是在面向对象的语言中,将数组包装在更有意义的数据结构中变得非常容易。只需使用平坦的数组并插入您的索引即可。 - aroth

2

正如之前所述,你无法真正使用此类数组,因为需要为每个维度编写不同的代码。

不过,可以使用反射创建这样的数组:

 import java.lang.reflect.Array;

 private Class<?> arrayClass(Class<?> compClass, int dimensions) {
     if(dimensions == 0) {
        return compClass;
     }
     int[] dims = new int[dimensions];
     Object dummy = Array.newInstance(compClass, dims);
     return dummy.getClass();
 }

 public Object makeArray(int dimensions) {
     Class<?> compType = arrayClass(double.class, dimensions-1);
     return Array.newInstance(compType, 10);
 }

然后您需要使用反射来访问您的数组,或将其强制转换为Object[](适用于所有大于1的维度),然后仅操作第一层。或将其提供给需要正确类型的数组的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接