Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/165: Рейтинг темы: голосов - 165, средняя оценка - 4.66
0 / 0 / 0
Регистрация: 27.03.2015
Сообщений: 21

Сортировка двумерного массива

21.07.2015, 01:13. Показов 36793. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.Arrays;
 
public class Three {
public static void main(String[] args) {
    int num[][] = {
            {5, 4, 45, 12},
            {7, 5, 8,  85},
            };
    Arrays.sort(num);
    for(int row = 0; row<2; row++){
        for(int col = 0; col<4; col++){
            System.out.print(num[row][col]);
        }
    }
}
}
Выдает ошибку. Одномерный массив сортировало. Сортировка по возрастанию, от меньшего значения к большему, в данном случае 4, 5, 5, 7... В чем проблема?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.07.2015, 01:13
Ответы с готовыми решениями:

Сортировка двумерного массива
Всем привет! Помогите решить проблему, пожалуйста, у меня есть двумерный массив массивов, состоящих из двух double чисел: {{123.32452,...

Сортировка двумерного массива
ребят, вот я создал двумерный массив, мне надо сортировать его либо выбором либо вставкой, не получается что то. кто нибудь помогите. ...

Сортировка двумерного массива (новичок)
Здравствуйте! У меня есть квадратный двумерный массив, который надо отсортировать. Проблема в том что у меня нет расширения...

10
 Аватар для ne2win
206 / 206 / 71
Регистрация: 25.02.2014
Сообщений: 569
21.07.2015, 01:19
idea_site, Вы смотрите что принимает метод, перед тем как ему что-либо передать?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
21.07.2015, 01:48
Самое незатейливое, что на ум пришло
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package easybudda.twodarraysort;
 
public class TwoDArraySort {
 
    public static void main(String[] args) {
        int[][] matrix = {
                { 5, 4, 45, 12 },
                { 7, 5, 8,  85 },
        };
        
        for ( int r = 0; r < matrix.length; ++r ) {
            for ( int c = 0; c < matrix[r].length; ++c ) {
                int lastC = c + 1;
                for ( int lastR = r; lastR < matrix.length; ++lastR ) {
                    while ( lastC < matrix[lastR].length) {
                        if ( matrix[lastR][lastC] < matrix[r][c] ) {
                            int tmp = matrix[r][c];
                            matrix[r][c] = matrix[lastR][lastC];
                            matrix[lastR][lastC] = tmp;
                        }
                        ++lastC;
                    }
                    lastC = 0;
                }
            }
        }
        
        for ( int i = 0; i < matrix.length; ++i )
            System.out.println(java.util.Arrays.toString(matrix[i]));
    }
 
}

Не по теме:

Double 8-) Bubble

1
0 / 0 / 0
Регистрация: 03.08.2015
Сообщений: 3
04.08.2015, 17:40
easybudda,
я так понимаю, что с строчки 14 начинается цикл сортировки.
1. переменные lastС и lastК, созданы для проверки текущего значения со следующим? если lastC = c + 1 то получается так.
2. цикл с 14 строчки, отвечает за переход на новую строку, до конца массива?
3. 21 ++lastC; не пойму( кроме того, что увеличивает lastC на 1
4. 23 lastC = 0; не понимаю зачем его обнулять?

Спасибо
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
04.08.2015, 20:13
qodi, r и c соответственно row и column, lastR и lastC - last row и last column (не самые удачные названия). Суть в следующем: каждый элемент матрицы сравниваем со всеми стоящими после него, если какой-то из них меньше сравниваемого - меняем их значения. Сравнения начинаются в той же строке (lastR = r) c элемента в следующем столбце (lastC = c + 1). Но тут нужно помнить, что очередной элемент может быть последним в строке и тогда lastC будет указывать за границу строки. По этому проверка по столбцам засунута в цикл while с ручным обнулением индекса столбца при переходе на новую строку.
Вот попроще вариант того же самого
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package easybudda.doublebubble;
 
public class DoubleBubble {
 
    public static void main(String[] args) {
        int[][] matrix = {
                { 5, 4, 45, 12 },
                { 7, 5, 8,  85 },
        };
        
        for ( int i = 0; i < matrix.length * matrix[0].length - 1; ++i ) {
            for ( int j = i + 1; j < matrix.length * matrix[0].length; ++j ) {
                if ( matrix[j / matrix[0].length][j % matrix[0].length] < matrix[i / matrix[0].length][i % matrix[0].length] ) {
                    int tmp = matrix[j / matrix[0].length][j % matrix[0].length];
                    matrix[j / matrix[0].length][j % matrix[0].length] = matrix[i / matrix[0].length][i % matrix[0].length];
                    matrix[i / matrix[0].length][i % matrix[0].length] = tmp;
                }
            }
        }
        
        for ( int i = 0; i < matrix.length; ++i )
            System.out.println(java.util.Arrays.toString(matrix[i]));
    }
 
}
0
0 / 0 / 0
Регистрация: 03.08.2015
Сообщений: 3
04.08.2015, 21:29
easybudda,
Теперь я понимаю, как сделать цикл который сравнит последний элемент строки и первый элемент следующей строки без выхода за предел. спасибо огромное!!!
Спасибо за вариант c if.
0
 Аватар для HOBATOP
323 / 310 / 206
Регистрация: 14.09.2015
Сообщений: 827
28.10.2015, 18:13
easybudda, я посмотрел предложенный Вами вариант сортировки и понял, что при переменной длине строк массива он не будет работать: если первая строка массива будет длиннее второй, то случится ошибка выхода на диапазон, а если вторая, то лишние элементы массива будут просто отсечены. Я ещё совсем недавно пытаюсь осваивать Java и просил бы, ежели не слишком обременительно, просмотреть вот такой вариант сортировки двухмерного массива с переменным числом и длиной строк. Подскажите, пожалуйста, что тут [в коде] хорошего, а, главное, что плохого. Спасибо.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
    public static void main(String[] args) {
    //Сортировка двухмерного массива с переменными числом и длиной строк
 
        //зададим число строк
        int x = (int) (Math.random() * 8 + 3);
        /*"Я не люблю давать товарищам советы,
         * Но знаю я разбой у них в чести.
         * Вот только что я прочитал про это:
         * не меньше трёх не больше десяти!" :-)
        */
        int[][] arrayTest = new int[x][]; //объявим массив из Х строк
 
        //длина будущих строк от единицы до десяти
        for (int i = 0; i < x; ++i) {
            arrayTest[i] = new int[(int) (Math.random() * 10 + 1)];
        }
        //полюбуемся, чего у нас получилось
        System.out.println("Исходный массив: ");
        //после заполнения массива случайными числами
        for (int i = 0; i < x; ++i) {
            for (int j = 0; j < arrayTest[i].length; ++j) {
                arrayTest[i][j] = (int) (Math.random() * 50 - 5);
                System.out.print(arrayTest[i][j] + "\t");
            }
            System.out.println();
        }
 
        //собственно сама сортировка
        int temp = 0;
        //в реальности можно вместо Х вставить arrayTest.length
        for (int i = 0; i < x; i++) {
            for (int j = 0; j < arrayTest[i].length; j++) {
                for (int k = 0; k < x; k++) {
                    for (int n = 0; n < arrayTest[k].length; n++) {
                        if (arrayTest[k][n] > arrayTest[i][j]) {
                            temp = arrayTest[k][n];
                            arrayTest[k][n] = arrayTest[i][j];
                            arrayTest[i][j] = temp;
                        }
                    }
                }
            }
        }
 
        System.out.println("\nУпорядоченный массив: ");
        for (int i = 0; i < x; ++i) {
            for (int j = 0; j < arrayTest[i].length; ++j) {
                System.out.print(arrayTest[i][j] + "\t");
            }
            System.out.println();
        }
    }
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
28.10.2015, 18:34
Цитата Сообщение от HOBATOP Посмотреть сообщение
и понял, что при переменной длине строк массива он не будет работать

Не по теме:

"ХРЯСТЬ!!!" сказала японская бензопила.


Тут важно понимать - двумерный массив и массив строк переменной длины - не одно и то же. По этому и речи не шло о том, что первая строка может оказаться длиннее или короче второй.
Цитата Сообщение от HOBATOP Посмотреть сообщение
вот такой вариант сортировки двухмерного массива с переменным числом и длиной строк
Ну, если работает, то и чудненько. А вообще, если память позволяет, проще слить всё в одномерный массив, его отсортировать и обратно...
0
 Аватар для HOBATOP
323 / 310 / 206
Регистрация: 14.09.2015
Сообщений: 827
28.10.2015, 20:13
Цитата Сообщение от easybudda Посмотреть сообщение
проще слить всё в одномерный массив
Вполне возможно, но меня сейчас интересует (пока чисто теоретически, куда это применить на практике - при отсутствии практики как таковой - не знаю) другой аспект. Вот многомерные массивы сортируют целиком, хотя было бы логичнее сначала отсортировать каждую строку отдельно (в Excel'e сортировка и фильтрация строк хорошо реализована - ну так то ж Excel!), а уже потом выстроить строки по ранжиру. А в более многомерных массивах (три-четыре и так далее) ещё больше вариантов и они вообще могут быть любопытными. Кое чего уже придумал, но пока что совсем сыро и невнятно.
Спасибо.
0
0 / 0 / 0
Регистрация: 27.06.2017
Сообщений: 37
17.12.2017, 11:09
Выражаю респект НОВАТОРу за предоставленный код. Я новичок в Java и для меня долго стаяла задача сортировки многомерного алгоритма. Сначала я придумал свой алгоритм. В нем дважды повторялся цикл сортировки, во втором цикле i и j менялись местами. Такой алгоритм работал только в том случае, если длина и ширина массива были равными. Потом долго искал примеры в интернете, но ничего разумного не было.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
for (i=0; i<array.length; i++){
               for (cout=0; cout<array[i].length; cout++){
                     for (j=0; j<array[i].length-1; j++){
                    
                            if (array[i][j] < array[i][j+1]){
                                
                            buf = array[i][j+1];
                            array[i][j+1] = array[i][j];
                            array[i][j] = buf;
                        
                             }// if array
                        }//for j
                    }//for cout
            }// for i
            
            
            for (i=0; i<array.length; i++){
               for (cout=0; cout<array[i].length; cout++){
                     for (j=0; j<array[i].length-1; j++){
                    
                            if (array[j][i] < array[j+1][i]){
                                
                            buf = array[j+1][i];
                            array[j+1][i] = array[j][i];
                            array[j][i] = buf;
                        
                             }// if array
                        }//for j
                    }//for cout
            }// for i
0
0 / 0 / 0
Регистрация: 09.04.2019
Сообщений: 3
17.11.2022, 11:12
Так этот код не работает
"C:\Program Files\Microsoft\jdk-11.0.12.7-hotspot\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2022.1.3\lib\idea_rt.jar=59890:C:\Progra m Files\JetBrains\IntelliJ IDEA Community Edition 2022.1.3\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\Sergei\IdeaProjects\untitled1\o ut\production\untitled1 Start
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException : Index 2 out of bounds for length 2
at Start.main(Start.java:37)

Process finished with exit code 1
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.11.2022, 11:12
Помогаю со студенческими работами здесь

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

Пузырьковая сортировка двумерного массива
Задан 2-й массив. Требуется отсортировать каждую строку по убыванию.Сортировка пузырьковая должна быть сделана отдельным методом. Ребята...

Сортировка двумерного массива по одному столбцу
здравствуйте. подскажите как можно отсортировать двумерный массив по одному из столбцов так, чтобы строки тоже менялись в соответствии со...

Сортировка Пузырьком (строки двумерного массива)
Дана вещественная матрица размером n строк, m столбцов. Для каждой строки найти наибольший элемент и упорядочить строки матрицы по...

Сортировка двумерного массива. Не могу найти ошибку
Привет. Помогите найти ошибку. Задача такая: двумерный массив отсортировать по строкам, что бы в начале каждой строки стоял самый больший...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru