は、それが配列の初期化とは何かを持っているように、メソッドに渡されたarray
は3×3ではないように見えます。例えば、例外を生成しない次の更新
public static void main(String[] args) throws IOException {
double[][] array = new double[][]{{1d,1d,1d},{2d,2d,2d},{3d,3d,3d}};
double[][] subArray = get2DSubArray(array, 1, 2, 1, 2);
for(double[] arrayElement : subArray){
for(double number : arrayElement){
System.out.println(number);
}
}
}
public static double[][] get2DSubArray(double[][] largeArray, int rowStartIndex, int rowEndIndex, int columnStartIndex,
int columnEndIndex) {
double[][] subArray = new double[rowEndIndex - rowStartIndex + 1][columnEndIndex - columnStartIndex + 1];
for (int row = rowStartIndex; row < rowEndIndex; row++) {
subArray[row] = Arrays.copyOfRange(largeArray[row], columnStartIndex, columnEndIndex);
}
return subArray;
}
上記溶液が例外を生成しないが、それは同様に正しい出力を生成しません。主に以下の理由:
Arrays.copyOfRange
方法について
- 3番目の引数は、排他的であるので、我々はそれがループの
- が唯一それが実行すべき一方の引数の提供セットに対して1回実行され動作するために
columnEndIndex+1
を渡す必要があり、少なくとも二回
- 代わりの
subArray[row]
にArrays.copyOfRange
を割り当て、我々は解決策以下subArray[<zero based index>]
に割り当てる必要があり、作業を行います。
public double[][] get2DSubArray(double[][] largeArray, int rowStartIndex, int rowEndIndex, int columnStartIndex,
int columnEndIndex) {
double[][] subArray = new double[rowEndIndex - rowStartIndex + 1][columnEndIndex - columnStartIndex + 1];
int index = 0;
for (int row = rowStartIndex; row <= rowEndIndex; row++) {
subArray[index++] = Arrays.copyOfRange(largeArray[row], columnStartIndex, columnEndIndex+1);
}
return subArray;
}
どのインデックス値が例外となるのか知っていますか? –
3x3の行列をインデックス(1,2,1,2)で入力すると例外が発生します(rowStartIndex = 1、rowEndIndex = 2など) –
上記の入力で回答を更新しました。 –