有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中用于创建具有任意维数的数组的方法

在Java中,是否可以创建一个方法来返回一个数组,数组的维数由参数传递

以下是我目前掌握的代码:

public static Object buildMultiDimensionalArray(int numDimensions) {

    if (numDimensions==1) {
        return new int[1];
    }
    if (numDimensions==2) {
        return new int[2][2];
    }
    if (numDimensions==3) {
        return new int[3][3][3];
    }
    if (numDimensions==4) {
        return new int[4][4][4][4];
    }
    if (numDimensions==5) {
        return new int[5][5][5][5][5];
    }
    if (numDimensions==6) {
        return new int[6][6][6][6][6][6];
    }
    // and so on...
    return null;
}

但这只适用于高达6的维度

是否有可能使此方法适用于任意数量的尺寸


共 (4) 个答案

  1. # 1 楼答案

    您可以返回具有显式容量的一维数组,并将其作为多维数组进行解析

    @SuppressWarnings("unchecked")
    public static <T> T[] buildMultiDimensionalArray(int dimensions, Class<T> clazz) {
        return (T[]) Array.newInstance(clazz, dimensions * dimensions);
    }
    
  2. # 2 楼答案

    这样的多维数组在代码中很少见到。也许您可以尝试使用元组的一维数组(d1,d2…)映射到一维数组索引,相同的幂。例如,要访问映射到(2*8+3)一维数组a[48]的[6][8]的第2行和第3列

  3. # 3 楼答案

    import java.lang.reflect.*;
    import java.util.*;
    public static Object nArray(int n) {
         int[]dim = new int [n];
         Arrays.fill(dim, n);
         return Array.newInstance(int.class,dim);
    }
    
  4. # 4 楼答案

    class nArray {
      int[] dims;
      int[] mults;
      int[] vals;
      nArray(int ... d) {
        int sum = 1;
        int len = d.length;
        dims = new int[len];
        mults = new int[len];
        for (int i=len-1; i>=0; i--) {
          dims[i]=d[i];
          mults[i] = sum;
          sum*=d[i];
        }
        vals = new int[sum];
      }
      void set(int v, int ... d) {
        int index = 0;
        for (int i=0; i<d.length; i++) {
          //if(d[i]>=dim[i]){throw new IndexOutOfBoundsException(); / NullPointerException } ???
          index+=d[i]*mults[i];
        }
        vals[index] = v;
      }
      int get(int ... d) {
        int index = 0;
        for (int i=0; i<d.length; i++) {
          // throw exception ?
          index+=d[i]*mults[i];
        }
        return vals[index];
      }
    }
    

    https://pastebin.com/k0hqcu5Y