2016-04-03 2 views
-1

Мне нужно создать метод в моем классе, чтобы добавить два массива 2d вместе. Один из них реализуется как параметр в методе, а другой - объект класса. Мне нужно убедиться, что массивы одного размера, и если да, добавьте их вместе. Я продолжаю получать ошибку Array Of Bounds. Что не так с моим кодом?Добавление Java 2d массивов

// method to add matrices 
    public int[][] add(int[][] matrix) { 
    int addedMatrices[][] = new int[row][column]; 
    if (userArray[row][column] == matrix[row][column]) { 
     for (int i = 0; i < row; ++i) { 
      for (int j = 0; j < column; ++j) { 
       addedMatrices[i][j] = matrix[i][j] + userArray[i][j]; 
       System.out.println(addedMatrices[i][j]); 
      } 
     } 
    } 
    return addedMatrices; 
} 
+0

Проводка трассировки стека (особенно бит, который сообщает вам, какая строка выбрала исключение) очень полезна. Глядя на код, похоже, что проблема 'if' является проблемой. Если бы у нас был номер строки, мы могли бы подтвердить или исключить его. –

ответ

2

if (userArray[row][column] == matrix[row][column]) есть проблема.

Помните, что массивы нуль-индексируются, поэтому элементы нумеруются от нуля до row - 1. Попытка получить доступ к строке row будет гарантией набрасывать ArrayIndexOutOfBoundsException, так как последняя строка находится в индексе row - 1.

Я не уверен, почему у вас даже есть эта линия. Если вы меняете row на row - 1 и column на column - 1, тогда эта строка проверяет, совпадают ли нижние правые значения в двух матрицах. Если они не будут, то матрицы не будут суммироваться. Это то, что вы намеревались сделать?

+0

О, ладно, спасибо! Я пересмотрел код на "if (userArray == matrix) {", потому что мне нужно убедиться, что массивы имеют одинаковый размер, прежде чем добавлять их.Но когда я пытаюсь его распечатать, печатается только ссылка на массив. Ты знаешь почему? – Ang

+0

'if (userArray == matrix)' тоже не будет работать - проверяет, являются ли 'userArray' и' matrix' ссылками на один и тот же объект. Вам нужно проверить 'userArray.length' и' matrix.length', а также длину каждой строки в каждом массиве. Что касается печати, это по дизайну. Объект Array не переопределяет 'toString', поэтому использует стандартную реализацию' toString'. Вам нужно будет написать собственный код для печати матрицы или использовать что-то вроде Apache Commons 'ArrayUtils.toString'. –

+0

Я рекомендую java.util.Array.toString() для печати. +1 для объяснения. – c0der

1

Я думаю, что это то, что вы пытаетесь сделать:

public class Test { 

    static int row =3; 
    static int column =2; 
    static int[][] userArray = new int[][] {{1,1},{2,2},{3,3}}; 

    public static void main(String[] args) { 

     add(new int[][] {{4,4},{5,5},{6,6}}); 
    } 

    // method to add matrices 
    public static int[][] add(int[][] matrix) { 

     int addedMatrices[][] = new int[row][column]; 

     //check arrays are of the same size 
     if ((userArray.length == matrix.length) && (userArray[0].length == matrix[0].length) ) { 

      for (int i = 0; i < row; ++i) { 

       for (int j = 0; j < column; ++j) { 
        addedMatrices[i][j] = matrix[i][j] + userArray[i][j]; 

        //printout 
        if(j == (column -1)) { 
         for(int col = 0; col < column; col++) { 
          System.out.print(addedMatrices[i][col]+ " "); 
         } 
        } 
        System.out.println(); 
       } 
      } 
     } 
     return addedMatrices; 
    } 
} 

или лучше:

public class Test { 

    static int[][] userArray = new int[][] {{1,1},{2,2},{3,3}, {4,4}}; 

    public static void main(String[] args) { 

     add(new int[][] {{5,5},{6,6},{7,7},{8,8}}); 
    } 

    // method to add matrices 
    public static int[][] add(int[][] matrix) { 

     //check arrays are of the same size 
     if ((userArray.length != matrix.length) || (userArray[0].length != matrix[0].length) ) { 

      System.out.println("Error: arrays are not of the same size"); 
      return null; 
     } 

     int rows = userArray.length; 
     int cols = userArray[0].length; 

     int addedMatrices[][] = new int[rows][cols]; 

      for (int i = 0; i < rows; ++i) { 

       for (int j = 0; j < cols; ++j) { 

        addedMatrices[i][j] = matrix[i][j] + userArray[i][j]; 

        //printout 
        if(j == (cols -1)) { 
         for(int col = 0; col < cols; col++) { 
          System.out.print(addedMatrices[i][col]+ " "); 
         } 
        } 
        System.out.println(); 
       } 
      } 

     return addedMatrices; 
    } 
} 

сделать распечатку более изящным вы могли бы изменить цикл для:

  for (int i = 0; i < rows; ++i) { 

       for (int j = 0; j < cols; ++j) { 

        addedMatrices[i][j] = matrix[i][j] + userArray[i][j]; 
       } 

       System.out.println(Arrays.toString(addedMatrices[i])); 
      } 
1

Линия if (userArray[row][column] == matrix[row][column]) { должна быть заменена линией, чтобы проверить, соответствуют ли размеры обеих матриц t он же (я думаю, это то, что предназначено). Предполагая, что они оба прямоугольные массивы, и не пусто:

public class MatrixAdder { 
    static public int[][] userArray = {{1,2},{3,4},{5,6}}; 

    static public int[][] add(int[][] matrix) { 
     final int nb_rows1 = matrix.length; // nb rows in matrix           
     final int nb_cols1 = matrix[0].length; // nb columns in matrix          
     final int nb_rows2 = userArray.length; // nb rows in userArray          
     final int nb_cols2 = userArray[0].length; // nb columns in userArray         
     // this assumes A[0] exists, and A[0].length == A[1].length == ...         
     // both for matrix and userArray                  
     int addedMatrices[][] = new int[nb_rows1][nb_rows1]; 
     if ((nb_rows1==nb_rows2) && (nb_cols1==nb_cols2)) { 
      for (int i = 0; i < nb_rows1; ++i) { 
       for (int j = 0; j < nb_cols1; ++j) { 
        addedMatrices[i][j] = matrix[i][j] + userArray[i][j]; 
        System.out.println(addedMatrices[i][j]); 
       } 
      } 
     } 
     return addedMatrices; 
    } 

    static public void main(String[] args) 
    { 
     int[][] mx1 = {{10,100},{20,200},{40,400}}; 
     int [][] mx2 = add(mx1); 
    } 
} 

Чтобы быть более надежным, вы можете проверить, что размеры всех вложенных массивов одинаковы. Вы также можете проверить, имеет ли матрица нулевой размер (иначе array[0] даст ошибку).

Если размеры не совпадают, возвращаемая матрица заполняется нулями.

Если это не совсем то, что вам нужно, оно должно дать вам достаточно намеков.

0

если (userArray [строка] [столбец] == матрица [строка] [столбец]) {}

Это странно для меня, честно, я не знаю, что намерения (Ваш просто сравнивая последний элемент каждого массива).

Я бы если (addedMatrices.length == userArray.length & & addedMatrices.length == matrix.length) {}.

Это уродливо, но я ничего не знаю о userArray или матрице. Я предполагаю, что userArray является глобальным. Также выполняйте j ++ и i ++, он имеет тот же конечный результат, но это скорее норма.

+0

Как это одно и то же дважды, сравнивая длину добавленныхMatrices как с userArray, так и с матрицей. Обеспечение того, чтобы все массивы имели одинаковый размер. – Hydtek

Смежные вопросы