Как мне сделать целую строку в массиве одним значением в Java?

#java #arrays #multidimensional-array

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

Вопрос:

Как мне сделать целую строку (или столбец) одним значением в массиве? Например, у меня есть строка из всех случайных чисел, и я хочу установить для всех этих значений значение 0.

Вот что у меня есть до сих пор:

 public class Assignment12 {
    public static void main(String args[]) {
        int[][] timestable = new int[10][10];
        printSquare(timestable);
        zeroRow(timestable, 5);
        printSquare(timestable);
        int[] arr = timestable[0];
    }

    public static void printSquare(int[][] arr) {
        for (int row = 0; row < 10; row  )
            for (int col = 0; col < 10; col  )
                arr[row][col] = (row   1) * (col   1);

        System.out.println();
        for (int row = 0; row < 10; row  ) {
            for (int col = 0; col < arr.length; col  )
                System.out.printf("M", arr[row][col]);
            System.out.println();
        }
    }

    public static void zeroRow(int[][] arr, int M) {
        for (int col = 0; col < M; col  ) {
            if (arr[M][col] != 0) {
                arr[M][col] = 0;
            }
        }
    }
}
  

Ответ №1:

  1. Массивы примитивов заполняются значениями по умолчанию ( 0 для целочисленных типов, 0.0 / 0.0f для типов с плавающей запятой, false для boolean ) и null для объектов при создании.

  2. Для заполнения одной строки в 2D-массиве рекомендуется использовать Arrays.fill метод:

 public static void fillRow(int[][] arr, int row, int value) {
    if (row < arr.length amp;amp; row >= 0 amp;amp; null != arr[row]) {
        Arrays.fill(arr[row], value);
    }
}

public static void zeroRow(int[][] arr, int row) {
    fillRow(arr, row, 0);
}
  
  1. Определенные столбцы могут быть заполнены с помощью циклов:
 public static void fillColumn(int[][] arr, int col, int value) {
    for (int[] row : arr) {
        if (null != row amp;amp; col >= 0 amp;amp; col < row.length) {
            row[col] = value;
        } 
    }
}

public static void zeroColumn(int[][] arr, int col) {
    fillColumn(arr, col, 0);
}
  

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

1. Я не уверен, что понимаю. Когда я введу ваш код, как я буду его использовать? zeroColumn(arr, col, 0) выдает ошибку.

2. zeroColumn имеет 2 аргумента, он вызывает fillColumn

Ответ №2:

Как мне сделать целую строку в массиве одним значением в Java?

По умолчанию примитивные int массивы фиксированной длины инициализируются 0. Чтобы заполнить их другими значениями, вы можете сделать следующее.

Используйте Arrays.fill метод.

 int[] tens = new int[5];
Arrays.fill(tens,10);

System.out.println(Arrays.toString(tens));
  

С принтами

 [10, 10, 10, 10, 10]
  

Или вы можете написать лямбда-выражение и вызвать его, когда вам нужно заполнить массив. Он также создаст массив для вас, поскольку вы указываете длину.

 BiFunction<Integer, Integer, int[]> fill =
        (val, len) -> {
                  int[] temp = new int[len];
                  Arrays.fill(temp, val);
                  return temp;};
        
int[] twos = fill.apply(2,10);
int[] threes = fill.apply(3,4);

System.out.println(Arrays.toString(twos));
System.out.println(Arrays.toString(threes));

  

С принтами

 [2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
[3, 3, 3, 3]
  

Или, в крайнем случае, сгенерировать одно из IntStream . Для массива 5's с длиной 7 выполните следующие действия:

 int[] fives = IntStream.generate(()-> 5).limit(7).toArray();
  

Примечание: После того, как у вас есть линейный массив, вы также можете назначить его любой строке в 2D-массиве. Рассмотрим предыдущие примеры twos и threes .

 int[][] b = new int[2][];
b[0] = twos;
b[1] = threes;

  

Ответ №3:

Вы можете обработать массив следующим образом:

 public static void fillRow(int[][] arr, int row, int val) {
    Arrays.fill(arr[row], val);
}
  
 public static void fillColumn(int[][] arr, int column, int val) {
    Arrays.stream(arr).forEach(row -> row[column] = val);
}
  
 public static void main(String[] args) {
    int[][] arr = new int[5][5];
    fillRow(arr, 3, 3);
    fillColumn(arr, 2, 2);

    // output
    Arrays.stream(arr).map(Arrays::toString).forEach(System.out::println);
}
  

 [0, 0, 2, 0, 0]
[0, 0, 2, 0, 0]
[0, 0, 2, 0, 0]
[3, 3, 2, 3, 3]
[0, 0, 2, 0, 0]