Java N维数组

我需要能够有一个n维字段,其中n基于构造函数的输入。 但我甚至不确定这是否可行。 是吗?

快速解决方案:你可以用一个非常ArrayListArrayList来近似它……就像你需要的那样深入。 但是,这可能会很快使用起来很尴尬。

需要更多工作的替代方法可以是使用底层平面数组表示来实现您自己的类型,您可以在其中内部计算索引,并为访问器方法提供vararg参数。 我不确定它是否完全可行,但可能值得一试……

粗略的例子(没有测试,没有溢出检查,error handling等,但希望传达基本的想法):

 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]; } ... } 

这是一篇很好的文章,解释了如何使用reflection在运行时创建数组: 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处理,并且必须使用Array类的getset方法来操作数组的元素。