我是Java新手(第2天),所以如果没有意义,请告知并原谅我。
我有一个二维数组,我想定义一个新数组,它包含第二维中特定位置的所有第一维(下面的例子)。我能想到的唯一方法是使用for
循环,如下所示:
double[][] twoDimArray = new double[5000][200];
// some code defining twoDimArray
double[] oneDimArray = new double[5000];
for (int i=0; i<5000; ++i) {
oneDimArray[i] = twoDimArray[i][199];
}
这很好用,但有更清洁的方法吗?也许是这样的:
double[] oneDimArray = twoDimArray[][199];
感谢。
答案 0 :(得分:4)
Java中没有多维数组,只有数组数组。但即使存在,尺寸也要存储在行主要或列主要顺序中。取决于此,相同“行”或相同“列”(即第一或第二维)中的单元连续地存储在存储器中并且可以直接分配给一维阵列。
由于您试图提取连续存储的维度,因此没有比for循环更好的方法。另一方面,如果你想从第一个位置199获得所有元素,你可以double[] oneDimArray = twoDimArray[199];
。
因此,如果在此维度中提取是您的常见用例,那么存储交换维度的数据是有意义的,即您可以这样做:
double[][] twoDimArray = new double[200][5000]; // dimensions are swaped here
// some code defining twoDimArray (with swapeddimensions)
double[] oneDimArray = twoDimArray[199];
答案 1 :(得分:2)
twoDimArray[0]
实际上是数组的第一个维度。
想象一下2D数组作为一堆1 D数组的行。因此,如果你有twoDimArray[5000][200]
,那么你有5000行(1D数组),每行有200个点。
所以twoDimArray[2]
实际上是第三行(1D数组),即double[]
编辑:由于在java中有阵列数组而不是2D数组,你可能想要将数组定义的顺序颠倒为数组[200] [5000]以便你可以在一行中轻松访问您想要的维度。
答案 2 :(得分:1)
您正在做的是最有效的方式。没有快捷方式(比如某些语言可能有newarr = oldarr[:][199];
或其他内容)。如果你不得不多做几次,我建议你做一个方法来做。
double[] acquireRow(double[][] orig, int row) {
double[] ret = new double[orig.length];
for(int i = 0; i < ret.length; i++) {
ret[i] = orig[i][row];
}
return ret;
}
答案 3 :(得分:1)
试试这个:
Double[] oneDimArray = new ArrayList<Double[]>(Arrays.asList(twoDimArray)).get(199);
答案 4 :(得分:0)
我认为你必须在创建数组时指定两个维度。如果由于不确定而不想指定该值,请阅读“列表”数据类型。