是否有可能创建具有可变维数的数组?
例如,
int x = 3;
// becomes
int[][][] array = new int[3][3][3];
//and
int y = 4;
//becomes
int[][][][] xray = new int[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];
}
等等......你应该能够看到模式。
一旦掌握了这一点,为一个采用可变维数的数组编写一个类应该不难。 get
和set
方法可以为可变数量的索引采用int...
参数,构造函数可以类似地使用int...
来指定维度。该类将具有私有的一维数组,其长度是所有维度的乘积。 get
和set
方法应检查每个索引,以确保它的> = 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
,可以轻松将其转换为正确的类型。