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

时间:2017-09-30 03:39:18

标签: java arrays

在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 个答案:

答案 0 :(得分:2)

SELECT id,
       STD_ID,
       SUB_ID,
       ASG_MARK = COALESCE(Cast(ASG_MARK as varchar(100)),'AB'),
       TH_MARKS = COALESCE(Cast(TH_MARKS as varchar(100)),'AB'),
       PR_MARCHAR = COALESCE(Cast(PR_MARCHAR as varchar(100)),'AB'),
       TOTAL = CASE
                 WHEN ASG_MARK IS NULL AND TH_MARKS IS NULL AND PR_MARCHAR IS NULL THEN 'AB'
                 ELSE Cast(COALESCE(ASG_MARK, 0) + COALESCE(TH_MARKS, 0) + COALESCE(PR_MARCHAR, 0) AS VARCHAR(100))
               END,
       GRADE = CASE
                 WHEN orgTotal BETWEEN 91 AND 100 THEN 'A1'
                 WHEN orgTotal BETWEEN 81 AND 90 THEN 'B1'
                 WHEN orgTotal BETWEEN 71 AND 80 THEN 'C1'
                 WHEN orgTotal BETWEEN 61 AND 70 THEN 'D1'
                 WHEN orgTotal BETWEEN 51 AND 60 THEN 'E1'
                 WHEN orgTotal BETWEEN 41 AND 50 THEN 'F1'
                 WHEN orgTotal = 0 AND ABcheck <> 1 THEN '0'
                 ELSE 'AB'
               END
FROM   MARKS_ENTRY
       CROSS apply (SELECT COALESCE(ASG_MARK, 0)+COALESCE(TH_MARKS, 0)+COALESCE(PR_MARCHAR, 0),
                           CASE
                             WHEN ASG_MARK IS NULL AND TH_MARKS IS NULL AND PR_MARCHAR IS NULL THEN 1 ELSE 0
                           END) tc (orgTotal, ABcheck) 

答案 1 :(得分:0)

您可以返回具有显式容量的单维数组,并将其解析为好像是多维数组。

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

答案 2 :(得分:0)

在代码中很少见到这样的多维数组。也许你可以尝试一维数组,其元组(d1,d2 ......)映射到1-d数组索引,功率相同。例如,访问[6] [8]的第2行和第3列,映射到(2 * 8 + 3)1-d数组a [48]

答案 3 :(得分:0)

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