我需要能够有一个n维字段,其中n基于构造函数的输入。但我甚至不确定这是否可行。是吗?
答案 0 :(得分:8)
快速解决方案:您可以使用非ArrayList
ArrayList
的{{1}}来近似它...根据您的需要尽可能深入。但是,这可能会很快使用起来很尴尬。
需要更多工作的替代方法可能是使用底层平面数组表示来实现您自己的类型,您可以在其中内部计算索引,并为访问器方法提供vararg参数。我不确定它是否完全可行,但可能值得一试......
粗略的例子(未经过测试,没有溢出检查,错误处理等,但希望传达基本想法):
class NDimensionalArray {
private Object[] array; // internal representation of the N-dimensional array
private int[] dimensions; // dimensions of the array
private int[] multipliers; // used to calculate the index in the internal array
NDimensionalArray(int... dimensions) {
int arraySize = 1;
multipliers = new int[dimensions.length];
for (int idx = dimensions.length - 1; idx >= 0; idx--) {
multipliers[idx] = arraySize;
arraySize *= dimensions[idx];
}
array = new Object[arraySize];
this.dimensions = dimensions;
}
...
public Object get(int... indices) {
assert indices.length == dimensions.length;
int internalIndex = 0;
for (int idx = 0; idx < indices.length; idx++) {
internalIndex += indices[idx] * multipliers[idx];
}
return array[internalIndex];
}
...
}
答案 1 :(得分:3)
这是一篇很好的文章,解释了如何使用反射在运行时创建数组:Java Reflection: Arrays。该文章解释了如何创建一维数组,但java.lang.reflect.Array
还包含另一个newInstance
方法来创建多维数组。例如:
int[] dimensions = { 10, 10, 10 }; // 3-dimensional array, 10 elements per dimension
Object myArray = Array.newInstance(String.class, dimensions); // 3D array of strings
由于直到运行时才知道维数,因此您只能将数组作为Object
来处理,并且必须使用get
的{{1}}和set
方法} class来操作数组的元素。
答案 2 :(得分:3)