一种方法是定义您自己的类来表示具有可变维度的数组。不过,实现该类并非易事。
我会利用 Java 的“可变数量”方法:
public class DynamicDimensionArray {
public DynamicDimensionArray(int... dimension) {
// code
}
这让调用者可以做类似的事情
DynamicDimensionArray vector = new DynamicDimensionArray(10); // one-dimensional
DynamicDimensionArray matrix = new DynamicDimensionArray(3, 5); // two-dimensional
DynamicDimensionArray fiveDim = new DynamicDimensionArray(2, 3, 2, 10, 4);
// five-dimensional
在构造函数内部,dimension 实际上被视为int[]。所以dimension.length 给了你维数。
那么你将如何实现这个类?我认为最简单的方法(实际上并不是那么简单)是使用私有变量,它是您类型的一维数组(假设它是double)。元素个数通过dimension中的元素相乘得到:
private double[] data;
public DynamicDimensionArray(int... dimension) {
int totalElements = 1;
for (int dim : dimension) {
totalElements *= dim;
}
data = new double[totalElements];
}
然后实现类的其余部分取决于您要支持哪些操作。您可能需要一个 getElement 方法来获取数组的一个元素:
public double getElement(int... index) {
// ???
}
和以前一样,index 将是方法内的int[]。您将检查以确保长度与原始 dimension 的长度匹配,如果不匹配则抛出异常。诀窍是将索引转换为可以在一维data 中使用的索引。基本公式(假设所有索引都是相对于 0 的)如下所示:
如果是维度为d0的一维数组,且索引为i0, data 的索引只是 i0。
如果它是一个具有维度 (d1, d0) 的二维数组,并且索引为 (i1, i0),data 的索引为 i1d0 + i0.
如果是3维数组,维度为(d2, d1, d0),索引为(i2,i1, i0),data 的索引是 i2d1d0 + i1d em>0 + i0.
等等……你应该能看到图案。
在 Wikipedia 中查找“行主要顺序”以获取更多信息。
不过,这不是微不足道的;因此,如果您仅限于少数维度,例如 3,那么您应该考虑 Tim 的评论,即使用 switch 可能没问题。