我正在尝试为我的矩阵理论类创建一个程序,让你输入自己的矩阵并进行缩放器乘法,我的问题是你如何让用户选择我首先想到的向量的维度来创建一个用一堆选项切换case语句,但它不是很动态。
switch (dimensions) {
case 1:
Vector[] matrix1 = new Vector[2];
break;
case 2:
Vector[][] matrix2 = new Vector[2][2];
break;
case 3:
Vector[][][] matrix3 = new Vector[2][2][2];
default:
break;
}
我没有找到任何代码要为我而写我不确定这是否是正确的方向或不感谢您提供任何帮助
答案 0 :(得分:0)
也许这个问题的答案很有用:
Is it possible to dynamically build a multi-dimensional array in Java?
基本上,你创造了一个多维的"数组使用:
java.lang.reflect.Array.newInstance(Class<?> componentType, int... dimensions)
例如:
int numberOfDimensions = 3;
int[] dims = new int[numberOfDimensions];
for (int i = 0; i < dims.length; i++) {
dims[i] = 2;
}
Object multiDimensionalArray = Array.newInstance(Vector.class, dims);
然后使用更多的反射和递归来填充值。
最后,最好将用户限制在固定数量的维度并坚持switch
阻止。
答案 1 :(得分:0)
一种方法是定义自己的类来表示具有可变维度的数组。但是,实现这个课程并不是一件容易的事。
我利用Java&#34;变量arity&#34;方法:
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相对的)如下所示:
如果它是维度为 d 0 的1维数组,且索引为 i 0 ,data
的索引只是 i 0 。
如果它是具有尺寸的二维数组( d 1 , d 0 ) ,索引是( i 1 , i 0 ),data
的索引是 i 1 d 0 + i 0 。
如果它是具有尺寸的三维数组( d 2 , d 1 , d 0 ),索引是( i 2 , i 1 , i 0 ),data
的索引是 i 2 d 1 d 0 + i 1 < em> d 0 + i 0 。
等等......你应该能够看到模式。
查找&#34;行主要订单&#34;在维基百科中获取更多信息。
但是,这不是微不足道的;因此,如果您仅限于少数维度(例如3),那么您应该考虑Tim的评论,使用switch
可能没问题。