2015-04-19 2 views
0

Я пытаюсь выполнить задание, которое просит меня создать метод на Java, который при заданной высоте и ширине создаст матрицу строк или столбцов.Как сгенерировать матрицы строк и столбцов в java?

enter image description here Вот то, что я до сих пор:

public static int[][] increasingMatrix(int width, int height, boolean format){ 


     if (format) { // generate row-major matrix 
      int[][] array = new int[height][]; 

      int count = 0; 

      for (int i = 0; i < height; i++) { 
       array[i] = new int[width]; 
       for (int j = 0; j < width; j++) { 
        array[i][j] = count; 
        count++; 
       } 
      } 

      return array; 

     } else { 
      int[][] array = new int[width][]; 


      int count = 0; 

      for (int i = 0; i < width; i++) { 
       array[i] = new int [height]; 
       for (int j = 0; j < height; j++) { 
        array[j][i] = count; 
        count ++; 
       } 
      } 

      return array; 
     } 

    } 

Однако, когда я иду и пытаюсь запустить тесты на сгенерированного массива, колонка-мажорных матрица (от того, что я могу сказать) это время генерируется неправильно. Строка-главная матрица, похоже, генерируется правильно.

Вы видите, что я делаю неправильно? Я уставился на это часами, но, похоже, не получилось никаких прорывов.

Спасибо!

ответ

1

Ваш код неправильно. Первым индексом в матрице всегда является ширина.

Помните: матрица представляет собой массив массивов. Первый индекс - это ширина матрицы, вторая - высота.

Попробуйте это:

if(format) { 
    return buildRowMajorMatrix(width, height); 
} else { 
    return buildColumnMajorMatrix(width, height); 
} 

Где buildRowMajorMatrix выглядит следующим образом:

private int[][] buildRowMajorMatrix(int width, int height) { 

    int[][] matrix = new int[width][height]; 
    int cellValue = 0; 

    for(int columnIndex = 0 ; columnIndex < width ; columnIndex++) { 
     for(int rowIndex = 0 ; rowIndex < height ; rowIndex++, cellValue++) { 
      matrix[columnIndex][rowIndex] = cellValue; 
     } 
    } 

    return matrix; 
} 

И buildColumnMajorMatrix выглядит следующим образом:

private int[][] buildColumnMajorMatrix(int width, int height) { 

    int[][] matrix = new int[width][height]; 
    int cellValue = 0; 

    for(int rowIndex = 0 ; rowIndex < height ; rowIndex++) { 
     for(int columnIndex = 0 ; columnIndex < width ; columnIndex++, cellValue++) { 
      matrix[columnIndex][rowIndex] = cellValue; 
     } 
    } 

    return matrix; 
} 
0

В другом условии:

else { 
     int[][] array = new int[width][]; 
     int count = 0; 

     for (int i = 0; i < width; i++) { 
      array[i] = new int [height]; 
      for (int j = 0; j < height; j++) { 
       array[j][i] = count; 
       count ++; 
      } 
     } 

     return array; 
    } 

Вы пытаетесь пытаетесь перебирать массивы (строки матрицы, J-индекс), которые еще не инициализированы. Чтобы реализовать основную матрицу столбца, вам необходимо сначала инициализировать все строки (или переключиться на более сложный алгоритм).

Также я думаю, что ширина и высота матрицы в обоих форматах должны быть одинаковыми. Большинство строк и столбцов говорят только о том, заполняем ли мы матрицу итерациями по столбцам или строкам, но, как мне кажется, формулировка задачи оставляет место для интерпретации.

Мое решение:

public static int[][] increasingMatrix(int width, int height, boolean format){ 
    int[][] array = new int[height][width]; // Java's shortcut generating regular array of arrays for you 
    int count = 0; 
    if (format) { // generate row-major matrix 
     for (int i = 0; i < height; i++) { 
      for (int j = 0; j < width; j++) { 
       array[i][j] = count; 
       count++; 
      } 
     } 
    } else { 
     for (int j = 0; j < width; j++)) { 
      for (int i = 0; i < height; i++ { 
       array[i][j] = count; 
       count++; 
      } 
     } 
    } 

    return array; 
} 
Смежные вопросы