Сгенирировать 2-мерный массив 5х4 и отсортировать его 3 столбец по возрастанию
Нужно создать 2-мерный массив 5х4 и отсортировать 3-й столбец по возрастанию. Я пробовал писать код:
int[][] a = new int[5][4];
int b;
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
a[i][j] = (int) (Math.random() * 100);
}
}
System.out.println("Массив:");
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
System.out.print("a[" + i + "][" + j + "]=" + a[i][j] + "\t");
}
System.out.println();
}
System.out.println();
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length; j++) {
for (int k = j + 1; k < a.length; k++) {
if (a[i][j] > a[i][k]) {
b = a[i][j];
a[i][j] = a[i][k];
a[i][k] = b;
}
}
}
}
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length; j++) {
System.out.print(a[i][j] + " ");
}
System.out.println();
}
Массив выводится, но не сортируется, выскакивает ошибка:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 4 out of bounds for length 4
at twomasiws.Masiws.main(Masiws.java:32)
Ответы (1 шт):
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 4 out of bounds for length 4
at twomasiws.Masiws.main(Masiws.java:32)
Переходим на строку 32
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length; j++) // line 32
Вы здесь создаёте вложенный цикл, но условием завершения ставите a.length, а это количество строк в матрице. Через какое-то время цикл попытается получить элемент [0][4] из матрицы размером [5][4] и конечно выйдет за её границы.
Вы ведь в цикле, который заполняет массив верно указали условие завершение внутреннего цикла for (int j = 0; j < a[i].length; j++), так и используйте его дальше.
С квадратной матрицей бы сработало, но... 5x4 - не квадрат.
(в последнем цикле, который выводит массив - та же проблема)
Второе: вы пишете
Нужно создать 2-мерный массив 5х4 и отсортировать 3-й столбец по возрастанию
А фактически сортируете весь массив.
Я бы вообще предложил вот такое решение:
import java.util.Arrays;
import java.util.Random;
public class Main {
public static void main(String[] args) {
int[][] array = new int[5][4];
Random rand = new Random();
Arrays.stream(array).forEach(flatArray -> Arrays.setAll(flatArray, element -> rand.nextInt(32768)));
System.out.println("The original array: " + Arrays.deepToString(array));
Arrays.sort(array[2]);
System.out.println("Array with sorted 3rd column: " + Arrays.deepToString(array));
}
}
- Тут скорее всего вам многое непонятно, давайте разбираться:
Arrays.stream(array).forEach(flatArray -> Arrays.setAll(flatArray, element -> rand.nextInt(32768)));
Используем Stream API (ну... а почему бы и нет?)
forEach() перебирает все массивы внутри матрицы, и для каждого из них вызывает лямбду:
flatArray -> Arrays.setAll(flatArray, element -> rand.nextInt(32768))
Здесь метод setAll устанавливает всем элементам массива случайные значения, полученные из rand.nextInt()
Все это можно заменить вот таким кодом:
for (int[] flatArray : array) {
Arrays.setAll(flatArray, element -> rand.nextInt(32768));
}
или
for (int i = 0; i < array.length; ++i) {
for (int j = 0; j < array[i].length; ++j) {
array[i][j] = rand.nextInt(32768);
}
}
- Далее
Arrays.deepToString(array) просто переведёт матрицу в строку, чтобы не писать стандартный цикл вывода.
- Теперь сортировка:
Arrays.sort(array[2])
отсортирует 3й столбец матрицы
(можно заменить своим методом, тем же Bubble Sort, как у вас, но... мы ж ленивые будем пользоваться уже готовым методом сортировки)
- И снова вывод на консоль, с помощью уже знакомого вам
Arrays.deepToString(array)
Вот вроде и всё, надеюсь, будет понятно :)