С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/64: Рейтинг темы: голосов - 64, средняя оценка - 4.98
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153

Сортировка коллекции List с компаратором

16.09.2019, 22:53. Показов 11958. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста как создать компаратор для сортировка ArrayList типа String.
Везде в примерах показана сортировка коллекции с Объектами. Сооветственно создаются классы, объекты итп.
У меня по заданию отсортировать список строк по длине. Все делать в main. Список создавать на "лету" хардкодом. Я так и не пойму - разве здесь нужны отдельные классы, где и как иплементировать свой метод compare ?
Java
1
2
3
4
5
6
7
8
9
10
List<String> strList = new ArrayList<String>();
        strList.add("AA");
        strList.add("CCCC");
        strList.add("BBBBB");
        strList.add("Z");
        strList.add("EEE");
 
public int compare(Object one, CustomObject two) {
                return one.длина строки - two.длина строки;
            }
как и где это все написать? )
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.09.2019, 22:53
Ответы с готовыми решениями:

Сортировка коллекции List
Здравствуйте! Надо отсортировать коллекцию List студентов по уменьшению среднего балла. Если одинаковый балл - сортировать по фамилии....

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

Сортировка с собственным компаратором
class Comprasion def self.compare(a, b) c1 = findMaxSub(a) c2 = findMaxSub(b) c1 &lt;=&gt; c2 end def...

17
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
16.09.2019, 23:02
Лучший ответ Сообщение было отмечено SergTN как решение

Решение

Java
1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
        List<String> strList = new ArrayList<>();
        strList.add("AA");
        strList.add("CCCC");
        strList.add("BBBBB");
        strList.add("Z");
        strList.add("EEE");
 
        strList.sort(Comparator.comparingInt(String::length));
        strList.forEach(System.out::println);
    }
Добавлено через 18 секунд
SergTN, пойдет?

Добавлено через 1 минуту
Если развернуть лямбду, то
Java
1
2
3
4
5
6
strList.sort(new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return s1.length() - s2.length();
            }
        });
1
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
16.09.2019, 23:18  [ТС]
Цитата Сообщение от iSmokeJC Посмотреть сообщение
SergTN, пойдет?
Да супер! Только я не понял как это вы сделали) Можете объяснить подробнее) Я с лямбда знаком плохи и у нас ее еще не читали. Во втором случае - это кажеться называется анонимный класс?
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
16.09.2019, 23:27
SergTN, что именно? У листа вызывается метод sort, который аргументом может принимать компаратор. Можно создать свой класс-наследник от Comparator в котором переопределяется метод compare(), а можно прямо в аргументе функции создать анонимный класс, что и проделано во втором фрагменте кода. А в первом - то же самое, но с использованием лямбда-выражения (если уж совсем точно, то method reference).


Добавлено через 1 минуту
Если просто лямбда, то вот таким образом -
Java
1
strList.sort((s1, s2) -> s1.length() - s2.length());
0
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
16.09.2019, 23:35  [ТС]
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Можно создать свой класс-наследник от Comparator в котором переопределяется метод compare(),
а можно еще тогда пример как сделать через такой класс?
в нем будет просто переопределение compare?

Java
1
2
3
4
5
6
7
public class MyComparator implements Comparator{
@Override          
public int compare(String s1, String s2) {
                return s1.length() - s2.length();
            }
 
}
а в main :
strList.sort(MyComparator.compare() ) или как?
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
16.09.2019, 23:41
Цитата Сообщение от SergTN Посмотреть сообщение
или как?
Java
1
strList.sort(new MyComparator() )
Добавлено через 2 минуты
Ну а если много раз будет вызываться сортировка, то создать объект твоего компаратора и использовать его
Java
1
2
3
Comparator<String> myComparator = new MyComparator();
//...
strList.sort(myComparator);
0
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
16.09.2019, 23:42  [ТС]
А в классе myComparator я все правильно написал?

Цитата Сообщение от iSmokeJC Посмотреть сообщение
strList.sort(myComparator);
а параметры как туда будут передаваться:
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
16.09.2019, 23:48
Цитата Сообщение от SergTN Посмотреть сообщение
в классе myComparator я все правильно написал?
Да, в данном случае этого достаточно.

Добавлено через 4 минуты
Цитата Сообщение от SergTN Посмотреть сообщение
а параметры как туда будут передаваться
Какие параметры?
0
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
16.09.2019, 23:52  [ТС]
Цитата Сообщение от iSmokeJC Посмотреть сообщение
Какие параметры?
не совсем понимаю механизм передачи String s1, String s2 в компаратор, хотя они передаются туда))
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
16.09.2019, 23:56
Цитата Сообщение от SergTN Посмотреть сообщение
не совсем понимаю механизм
Грубо говоря метод sort, вызываемый у списка сортирует этот список по критериям, определенным в методе compare. Тебе туда ничего передавать не надо. Вот прочитай внимательно например эту статью.
1
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
17.09.2019, 01:06
SergTN, возьми и напиши сортировку пузырьком, сделай, чтобы сравнение происходило с помощью компаратора, внезапно все сразу поймёшь
0
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
17.09.2019, 20:16  [ТС]
Цитата Сообщение от xoraxax Посмотреть сообщение
сделай, чтобы сравнение происходило с помощью компаратора, внезапно все сразу поймёшь
у куда же там компаратор то вставить?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
17.09.2019, 20:28
сортировку напиши - покажу
0
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
17.09.2019, 21:14  [ТС]
Делал в одном из заданий
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Sort Equipment by Power
        public static Power[] sortEquipment(Power[] equipment) {
             // Sort Equipment by Power (Class field power)
            // Return sorted array
            Power temp_sort;
            for (int i = 0; i < equipment.length; i++) {
                for (int j = i + 1; j < equipment.length; j++) {
 
                    if (equipment[i].power > equipment[j].power) {
                        temp_sort = equipment[i];
                        equipment[i] = equipment[j];
                        equipment[j] = temp_sort;
                    }
                }
            }
            return equipment;
        }
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
17.09.2019, 21:32
equipment[i].power > equipment[j]
Вместо этого вставь компаратор
0
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
17.09.2019, 21:45  [ТС]
if ( compare(equipment[i].power, equipment[j] ){
....
}
?
0
502 / 348 / 134
Регистрация: 14.06.2016
Сообщений: 669
17.09.2019, 21:54
if ( compare(equipment[i], equipment[j] ) > 0)
1
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
18.09.2019, 00:38  [ТС]
Цитата Сообщение от vcrop Посмотреть сообщение
if ( compare(equipment[i], equipment[j] ) > 0)
да, так понятнее)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.09.2019, 00:38
Помогаю со студенческими работами здесь

Отображение в listBox поля элемента из коллекции коллекций List<List<>>
Есть карта в pictureBox-е. На ней мышкой ставяться флажки(маркеры). Нужно хранить их в БД с возможностью добавлять/удалять/изменять...

коллекции List<T>
Всем здрасте! к примеру, есть типиизованный список List&lt;T&gt; Items = new List&lt;T&gt;(); добавляем туда какой нибудь элемент ...

Сериализация коллекции List<T>
Необходимо сериализовать коллекцию List&lt;FileInfo&gt; для передачи от сервера к клиенту. Как это возможно сделать и есть ли способ без...

Сериализация коллекции List<>
У меня вопрос: soap и xml сериализации работают с коллекциями? У меня вот такой код public class serialization { ...

Сортировка двумерного List<List<string>>, по 1-ой строке, чтобы элементы 2-ой строки передвинулись в соответствии с 1-ой
Дан двумерный массив List&lt;List&lt;string&gt;&gt; , состоящий из двух строк, как его отсортировать по первой строке, чтобы элементы второй строки...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru