Симметричный 2D массив случайных чисел

#java #arrays #matrix #multidimensional-array

#java #массивы #матрица #многомерный массив

Вопрос:

 public static int[][] Matrix(int n, int max, int min) {
    int[][] grid = new int[3][3];
    Random rand = new Random();

    rand.setSeed(System.currentTimeMillis());

    for (int i = 0; i < n; i  ) {
        for (int j = 0; j < i; j  ) {
            int value = Math.abs((min   rand.nextInt((max - min)   1)));
            grid[i][j] = value;
            grid[j][i] = value;
        }
    }
    return grid;
}
 

Следующий код выводит 2D-симметричный массив, где значениями являются случайные числа в диапазоне (min и max), который выводит следующий результат в качестве примера:

 0 14 11 
14 0 17 
11 17 0 
 

Моя проблема с кодом заключается в том, что он печатается только 0 как диагональное значение. Как я могу изменить его, чтобы печатать диагональные значения, где они заданы как int min вместо 0 ? Например, в приведенном выше коде значение int min равно 8 , следовательно, это даст такой результат:

 8 14 11 
14 8 17 
11 17 8 
 

Комментарии:

1. является ли printArray встроенным методом Java или это метод вашего создания? Java может распознать это.

2. @ColeHenrich я создал отдельный метод, который я не добавил в этот код

3. пожалуйста, добавьте его, спасибо!

Ответ №1:

Если вы хотите установить диагональ на меньшую переменную, вам нужно сделать две вещи.

Во-первых, поскольку вы задаете j < i, j никогда не будет равно i, то есть диагональ будет установлена на 0, потому что Java инициализирует целые числа равными 0, если им не задано явное значение инициализации. Я смог получить доступ к диагонали, просто изменив < на <=:

 for(int i = 0; i < n; i  )
{
    for(int j = 0; j <= i; j  )
    {
        ...
    }
}
 

Во-вторых, как только i равно j, вам нужно добавить оператор if, который проверяет случай, когда они равны. Когда они есть, просто установите для текущей ячейки сетки значение нижней переменной. Не забудьте заключить вторую половину второго блока кода for в блок else, иначе вы получите непреднамеренное поведение:

 for(int j = 0; j <= i; j  ) 
{
    if(i == j)
    {
        grid[i][j] = lower;
    }
    else
    {
        ...
    }
}
 

Наконец, весь ваш блок цикла for должен выглядеть следующим образом:

 for(int i = 0; i < n; i  ) 
{
    for( int j = 0; j <= i; j  ) 
    {
        if(i == j)
        {
            grid[i][j] = lower;
        }
        else
        {
            int value = Math.abs((lower   rand.nextInt((upper - lower)   1)));   
            grid[i][j] = value;
            grid[j][i] = value;
        }  
    }
}
 

Комментарии:

1. У меня также есть еще один вопрос, связанный с тем же вопросом. Я хочу, чтобы этот код мог возвращать значение null при n<=0, но когда я использую if (n<= 0) {return null;}, отображается ошибка. как я могу это исправить?

2. Когда вы говорите, что хотите вернуть null, вы имеете в виду, что просто хотите, чтобы код печатал null, если n слишком мало?

3. да, если n<=0 , выведите null . я попытался добавить оператор if, но он возвращает ошибку

Ответ №2:

Вы генерируете случайное значение для всех i и j за исключением случаев i==j , когда это диагональные значения. Кроме того, все значения диагоналей будут одинаковыми. Поэтому, прежде чем возвращать сетку, вы можете сгенерировать одно последнее случайное значение и поместить его в диагонали. Что-то вроде этого

 int diagonalValue = Math.abs((min  rand.nextInt((max- min)   1)));   
for( int k=0 ; k<n ; k  ) 
{
    grid[k][k] = diagonalValue;
}
 

Ответ №3:

Обзор кода:

  • Добавьте недопустимые проверки синтаксиса в начало метода;
  • Math.abs является избыточным;
  • Внутренний цикл должен включать верхнюю границу;

Ваш код может выглядеть примерно так:

 public static int[][] matrix(int n, int max, int min) {
    // incorrect matrix size
    if (n <= 0)
        return new int[][]{{}};
    int[][] grid = new int[n][n];
    // incorrect random value bound
    if (max - min <= 0)
        return grid;

    Random rand = new Random();
    // interval excluding upper bound
    IntStream.range(0, n).forEach(i ->
            // interval including upper bound
            IntStream.rangeClosed(0, i).forEach(j -> {
                if (i == j) {
                    // main diagonal
                    grid[i][j] = min;
                } else {
                    // peripheral elements
                    int value = min   rand.nextInt((max - min)   1);
                    grid[i][j] = value;
                    grid[j][i] = value;
                }
            }));
    return grid;
}
 
 public static void main(String[] args) {
    Arrays.stream(matrix(5, 9, 1))
            .map(Arrays::toString)
            .forEach(System.out::println);
}
 

Вывод:

 [1, 6, 3, 3, 2]
[6, 1, 9, 4, 2]
[3, 9, 1, 6, 7]
[3, 4, 6, 1, 9]
[2, 2, 7, 9, 1]