繁体   English   中英

Java中创建任意维数数组的方法

[英]Method in Java for creating an array with arbitrary number of dimensions

是否可以在 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 的维度。

是否可以使这种方法适用于任意数量的维度?

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM