数组索引超出范围

时间:2012-10-16 19:29:10

标签: java arrays indexing

public class Homework2 {
    public static void main(String[] args){
        int num1 = (int) (Math.random()*(10-3+1)+3);
        int num2 = (int) (Math.random()*(10-3+1)+3);

        double[][] doubMatrix1 = new double[num1][num2];
        double[][] doubMatrix2 = new double[num1][num2];
        double[][] doubMatrix3 = new double[num1][num2];

        doubMatrix1 = getdoubMatrix(num1,num2);
        doubMatrix2 = getdoubMatrix(num1,num2);
        doubMatrix3 = addMatrices(doubMatrix1, doubMatrix2, num1, num2);        
        printDoubMatrix("First matrix", doubMatrix1);
        printDoubMatrix("Second matrix", doubMatrix2);
        printDoubMatrix("Result of adding", doubMatrix3);
        doubMatrix2 =transposeMatrix(num1,num2);



    }

    public static double[][] getdoubMatrix(int num1,int num2){

        double[][] tempArray = new double[num1][num2];
        for(int i = 0;i < tempArray.length;i++)
            for(int j = 0;j < tempArray[i].length;j++)
            {
            tempArray[i][j] = Math.random() * (100);                
            }
        return tempArray;
    }

    public static double[][] addMatrices(double[][] doubMatrix1, double[][] doubMatrix2,int num1,int num2)
    {

        double[][] tempArray = null;
        if(doubMatrix1.length == doubMatrix2.length)
            if(doubMatrix1[0].length == doubMatrix2[0].length)
            {
                 tempArray = new double[num1][num2];
                for(int i = 0; i< doubMatrix1.length;i++)
                      for(int j = 0; j< doubMatrix1[i].length;j++ )
                      {
                          tempArray[i][j] = doubMatrix1[i][j] + doubMatrix2[i][j];
                      }
            }
            else
            {
                return tempArray = new double[0][0];

        }

        return tempArray;
    }

    public static void printDoubMatrix(String text,double[][] doubMatrix1){

        System.out.println(text);
        for(int i = 0; i< doubMatrix1.length;i++)
              for(int j = 0; j< doubMatrix1[i].length;j++ )     
                  System.out.printf("%f\n", doubMatrix1[i][j]);                         
}

    public static double[][] transposeMatrix(int num1, int num2){
        double[][] tempArray = new double[num2][num1];
        for(int i = 0;i < tempArray.length;i++)
            for(int j = 0;j < tempArray[i].length;j++)
            {
                tempArray[i][j] = tempArray[j][i];
                System.out.printf("%f\n", tempArray[i][j]); 
            }    
        return tempArray;
    }

}

我在运行这个程序时遇到问题,没有错误,但是当我运行它时说数组索引超出限制,问题出在transpose方法,有谁能告诉我如何解决这个问题?< / p>

6 个答案:

答案 0 :(得分:3)

transpose 方法的for循环中的赋值应该是: -

tempArray[i][j] = doubleMatrix2[j][i];

而不是: -

tempArray[i][j] = tempArray[j][i];

在上面的代码中,您只是将新创建的数组tempArray中的值赋给自己。这没有意义。它不会影响数组。如果ArrayIndexOutOfBounds

,它也会抛出row != col例外

您需要使用要转置的矩阵。

因为您正在为doubleMatrix2

调用此方法
doubMatrix2 =transposeMatrix(num1,num2);

你的两个矩阵就像: -

tempArray[][] = new double[num2][num1];

doubleMatrix[][] = new double[num1][num2];

因此,将doubleMatrix[j][i]分配给tempArray[i][j]是有意义的。因为行数和列数在两个矩阵中相反。

答案 1 :(得分:2)

在transposeMatrix函数中,您必须声明num1和num2具有相同的值。 在任何其他方面,它将导致一个ArrayOutOfBound,只是检查你的逻辑,你会看到你在矩阵的维度中使用“i”和“j”值,所以它们都是相等的。

答案 2 :(得分:1)

您的问题如下:

tempArray[i][j] = tempArray[j][i];

变量j的范围可以从0到tempArray [i] .length。但是,您正在使用它来索引tempArray本身(tempArray [j] [i])。因此,如果j大于tempArray.length,您将收到错误。

此外,该函数似乎没有做任何事情,因为tempArray中没有任何内容。

答案 3 :(得分:1)

我认为你假设你的二维数组不是一个参差不齐的数组,它包含相同数量的行和列。但并非总是如此。

答案 4 :(得分:0)

我的猜测是问题出现在这个循环中 - 有时只会发生。

    double[][] tempArray = new double[num2][num1];
    for(int i = 0;i < tempArray.length;i++) {
        for(int j = 0;j < tempArray[i].length;j++) {
            tempArray[i][j] = tempArray[j][i];
            System.out.printf("%f\n", tempArray[i][j]); 
        }
    }

那么当num2num1(或ij)不相等时会发生什么?让我们展平循环并使用num1num2 ...

的常量值
    double[][] tempArray = new double[2][5];
    // i=0, j=0
    tempArray[0][0] = tempArray[0][0];
    System.out.printf("%f\n", tempArray[0][0]); 
    // i=0, j=1
    tempArray[0][1] = tempArray[1][0];
    System.out.printf("%f\n", tempArray[0][1]); 
    // i=0, j=2
    tempArray[0][2] = tempArray[2][0]; // Array index out of bounds!

在第三个“循环”中,您尝试访问tempArray[2][0] - 但临时数组的大小定义为double[2][3]。这意味着没有tempArray[2],更不用说tempArray[2][0]

答案 5 :(得分:0)

在转置矩阵方法中,您可以就地转置。这意味着您尝试在不使用任何新数组的情况下替换元素。此外,初始化为num1 * num2大小的tempArray没有在transposeMatrix方法中初始化的任何值。

我建议如下:

  1. 将数组传递给要转置的转置方法。可以说,这有m行和n列
  2. 创建一个大小为n行m列的新数组
  3. 现在使用for循环将array1 [i] [j]复制到array2 [j] [i]。
  4. 索引超出范围是显而易见的,因为虽然tempArray [i] [j]对所有情况都有效,但tempArray [j] [j]不是

    以下是您可以尝试的示例代码:

    //assuming array1 is of size num1 * num2
    public static double[][] transposeMatrix(int num1, int num2, double[][] array1){
        double[][] tempArray = new double[num2][num1];
        for(int i = 0;i < num1;i++)
            for(int j = 0;j < num2;j++)
            {
                tempArray[j][i] = array1[i][j];
                //System.out.printf("%f\n", tempArray[j][i]);   
            }    
        return tempArray;
    }