Java变量数组中的维数

时间:2017-02-02 02:04:04

标签: java arrays multidimensional-array

是否有可能创建具有可变维数的数组?

例如,

int x = 3;
// becomes
int[][][] array = new int[3][3][3];

//and
int y = 4;
//becomes
int[][][][] xray = new int[4][4][4][4];

我的例子如此间接的部分原因是因为我不知道如何做这样的事情。

如果我有一个变量,我想创建一个与所述变量

具有相同维数的数组

4 个答案:

答案 0 :(得分:3)

您无法直接执行此操作,但可以使用一维数组进行模拟。

假设您有一个包含3行和4列的二维数组。您可以将其实现为包含12个元素的数组,并编写get例程来获取A[i,j]元素,如下所示:

int[] A = new int[12];

int get(int i, int j) {
    return A[4 * i + j];
}

当然,您可以编写set方法以相同的方式设置数组的元素。

继续使用尺寸为3x4x5的三维数组,你可以做类似的事情:

int[] A = new int[60];

int get(int i, int j, int k) {
    return A[4*5*i + 5*j + k];
}

或4维3x4x5x6阵列:

int[] A = new int[360];

int get(int i, int j, int k, int m) {
    return A[4*5*6*i + 5*6*j + 6*k + m];
}

等等......你应该能够看到模式。

一旦掌握了这一点,为一个采用可变维数的数组编写一个类应该不难。 getset方法可以为可变数量的索引采用int...参数,构造函数可以类似地使用int...来指定维度。该类将具有私有的一维数组,其长度是所有维度的乘积。 getset方法应检查每个索引,以确保它的> = 0且小于相应的维度,否则抛出异常。

这就是在大多数支持它们的语言中实现“真正的”多维数组的方式(Java不是其中之一;它只有一维数组,其元素可以是引用到其他一维数组)。它被称为“行主要订单”。有关详细信息,请参阅https://en.wikipedia.org/wiki/Row-_and_column-major_order(包括通用公式)。

答案 1 :(得分:1)

简单回答你不能。 理由:在数学世界中没有任何实例,这样的构造可能是最适合任何事物的,所以Prophets(K& R和所有发明代码的优秀人员)都会将此留给需要它的开发人员。

但这是我的2美分: 我假设您要初始化引擎......

engine.init(n);

其中n是您的维度。然后就可以把它从中拿出来。

engine.get(a1,a2,a3,...);
engine.put(val,a1,a2,a3...);

考虑像这样的课程

public class Engine{
private HashMap<Integer[],Object> storage;
private int dimension=1;
private set<integer[]> keys;
public void init(int n){
dimension=n;
//other initialization task;
}

public Object get(int... a){//use var args
integer[] key=findInkeySet(a);
return storage.get(key);
}

public void put(Object val, int... a){
keys.add(a);
storage.put(a,val);
}
}

因为需要异常处理和所有其他通用编码stuf

答案 2 :(得分:0)

我试着这样做,但返回类型是Object [] ^^&#34;

public Object[] MakeArray(int s){
  ArrayList l = new ArrayList<>(Collections.nCopies(s, 0));
  for (int i = 1; i < s; i++)
    l = copy(l,s);
  return l.toArray();
}
public ArrayList copy (ArrayList l,int s){
    ArrayList<ArrayList> ret = new ArrayList<>(s);
    for (int i = 0; i < s; i++) 
        ret.add(new ArrayList(l));
    return ret;
}

Arrays.toString(MakeArray(2)) = "[[0, 0], [0, 0]]"
Arrays.toString(MakeArray(3)) = "[[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]"

答案 3 :(得分:0)

public Object createMultidimensionalArray(int dimLength){
    int[] lengths = new int[dimLength];
    for(int i = 0; i < dimLength; i++)
        lengths[i] = dimLength;
    return Array.newInstance(int.class, lengths);
}

用法示例:

int[][][] array3D = (int[][][]) createMultidimensionalArray(3);
System.out.println(Arrays.deepToString(array3D));

输出:

[[[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]], [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]

说明:

函数Array.newInstance(Class<?> componentType, int... dimensions)将所需的数组类型和所有维度的长度作为输入。

dimensions是一个数组,用于告诉函数每个尺寸应为多少尺寸。要获得4x4x4x4数组,可以使用以下代码:

int[] dimensions = {4, 4, 4, 4};
Object arrObj = Array.newInstance(int.class, dimensions);
int[][][][] arr = (int[][][][]) arrObj;

Array.newInstance(...)返回一个Object,可以轻松将其转换为正确的类型。