#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:
-
Массивы примитивов заполняются значениями по умолчанию (
0
для целочисленных типов,0.0
/0.0f
для типов с плавающей запятой,false
дляboolean
) иnull
для объектов при создании. -
Для заполнения одной строки в 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);
}
- Определенные столбцы могут быть заполнены с помощью циклов:
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]