有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从2D double[]数组获取子数组

我试图从double[][]3x3矩阵中得到一个子数组(用于计算行列式)。我一直收到ArrayIndexOutOfBoundsException

知道为什么吗

public 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;
}

共 (1) 个答案

  1. # 1 楼答案

    看起来它与数组初始化有关,传递给该方法的array似乎不是3x3。例如,以下情况不会产生例外:

    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方法的第三个参数是独占的,所以我们必须传递columnEndIndex+1才能让它工作
    • 对于提供的参数集,for循环只执行一次,而它应该至少执行两次
    • 我们需要将Arrays.copyOfRange分配给subArray[row],而不是将其分配给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;
    }