|
88 / 86 / 55
Регистрация: 14.11.2015
Сообщений: 1,099
|
|
Comparable vs Comparator14.11.2016, 21:50. Показов 2079. Ответов 11
Метки нет (Все метки)
Несколько дней бьюсь над этой темой, но все равно остается недопонимание.
Вот, например, в этой статье приводиться следующий пример: Кликните здесь для просмотра всего текста
1) There is class called Person, sort the Person based on person_id, which is primary key in database
2) Sort the Person based on there name. For a Person class, sorting based on person_id can be treated as natural order sorting and sorting based on name field can be implemented using Comparator interface. To sort based on person_id we need to implement compareTo() method. Вопросы: 1. Они определили что person_id это natural order, а имя сортировать будут с помощью компаратора. Правильно ли я понимаю, что они это сделали только потому, что им нужно сортировать по двум полям? То есть мой вопрос в том, также правильно было бы считать сортировку по имени как natural order, а сортировку по id уже делать компаратором?
0
|
|
| 14.11.2016, 21:50 | |
|
Ответы с готовыми решениями:
11
Интерфейс Comparable Интерфейс Comparable Comparable в Array |
|
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
|
|
| 14.11.2016, 22:24 | |
Сообщение было отмечено Artmal как решение
Решение
Класс implements Comparable, если вы хотите, чтобы это сравнение использовалось по умолчанию. Comparator обычно используют в единичном случае сортировки. Допустим, сечас вам надо по 1 полю отсортировать, потом по другому.
1
|
|
|
88 / 86 / 55
Регистрация: 14.11.2015
Сообщений: 1,099
|
|
| 14.11.2016, 22:40 [ТС] | |
|
Немного прояснилось. Они используют Comparable в первом случае, потому что это удобно из-за того, что person_id еще и PK в базе данных и поэтому, скорее всего, придется часто сортировать по нему.
А если бы поле не было PK в базе данных, и сортировки были бы нужны только в двух отдельных местах, было бы логично использовать два компаратора, так?
0
|
|
|
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
|
|
| 15.11.2016, 07:29 | |
|
Мне кажется, надо смотреть на класс. Если это MyString, например, то надо сделать его comparable, так как обычно строки стравниваются по алфавиту. Для класса Person Comparable реализовывать не надо, так как фиг знает кто по какому полю захочет сортировать. Поэтому используем Comporator.
1
|
|
|
|
|||||||||||
| 15.11.2016, 09:16 | |||||||||||
|
Отвечу чуть по-другому.
Comparator -- когда нужно сравнить два объекта (м.б. вполне инстансы других абсолютно классов). То есть:
1
|
|||||||||||
|
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
|
||||||
| 05.10.2018, 12:31 | ||||||
|
У меня какая то странная проблема с генерик компаратором:
String a1=t1.getName(); ^ symbol: method getName() location: variable t1 of type Team where Team is a type-variable: Team extends Object declared in class TeamQueue Хотя клас определен без публик в то же файле, или отдельном как публик. В другом публик класе с методом main () - в том же файле, я создаю Team t=new Team("Name"); t.getName(); - и все работает. Кроме того компилятор не ругается на параметры типа Team - в том же компараторе??? То есть методы Тима не видны в другом класе, как бы они были не публичные но они как раз паблик. Добавлено через 7 часов 15 минут Что может лямбда выражение могут помочь? Или почему методы класа Tеаm не видны в анонимном класе Comparator? Не уж то надо еще чтобы Tеаm имплементовала еще и Comparable<Team> - но compаrеTo() я ведь применяю к стрингам. Еще интересный момент что когда я по ошибке сперва написал TеаmQuеuе <Tеаms> то компилятор не показывал ошибки - и сортировал по имени в реверсном порядке. Потом я поменял местами t1 и t2 и ничего не изменилось. Заметил что параметр класа Tеаms а не Tеаm и началась эта ошибка??
0
|
||||||
|
958 / 577 / 136
Регистрация: 23.05.2012
Сообщений: 7,364
|
||||||
| 05.10.2018, 12:55 | ||||||
|
arts1, что именно в 24-ой строке написано. Так же поменяйте объявление переменной на:
0
|
||||||
|
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
|
|||||||||||||||||||||
| 05.10.2018, 18:49 | |||||||||||||||||||||
|
Нет дело не в том: у меня ссылка так и приведена. Да и сообщение касается видимости метода - Team.
Вот если прямо определять класс
Если определять анонимный компаратор (в конструкторе или сеттере) - то появляется эта ошибка -
Добавлено через 1 час 32 минуты Если написать - class TeamComparator<Team> implements Comparator<Team> - то снова та же ошибка: Если оставить - TeamComparator implements Comparator<Team> - то надо приводить типы - teamComparator = (Comparator<Team>)new TeamComparator(); чтобы уже здесь не было ошибки компилятора несовместимых типов. И сортировать так конструкторе - Collections.sort(list,teamComparator); - но поскольку сперва список пуст, или он разрастается по ходу добавление элементов в аррайлист - что есть основой для PriorityQueue - мне тепер надо вызывать Collections.sort(list,teamComparator); - в реализации методов add(); offer(); Или вызвать его при применение методов peek(); poll(); - хотя все-таки сортировка после добавление будет принципиально правильной. Но почему class TeamComparator<Team> implements Comparator<Team> - обычный или анонимный клас не позволяет вызывать методы Team - типа что есть параметром - я не понимаю - разве надо применять T как обобщенный параметр - а уже в реализации приводить к Team. Добавлено через 21 минуту
0
|
|||||||||||||||||||||
|
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,764
|
||
| 05.10.2018, 21:32 | ||
|
1
|
||
|
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
|
|
| 05.10.2018, 21:48 | |
|
Тогда что надо правильно было написать class TeamComparator<T> implements Comparator<T> - а предыдущий вариат ошибка?
0
|
|
|
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,764
|
|
| 05.10.2018, 22:17 | |
|
0
|
|
|
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
|
|
| 06.10.2018, 03:56 | |
|
TeamQueue<Team> implements Iterable<Team> ;
TeamQueue tq=new TeamQueue(); Клас верхего уровя так у меня работает нормально. Но у меня почему то итератор по листу что в основе этой очереди - выводит элементы в обратном порядке нежели эта очередь. add()/offer() => list.add() - то есть вставляется в конец списка. peek()/poll() => list.get(list.size()-1) and list.remove(list.size()-1) Я так понял мне надо удалять и возвращать с начала - хотя лист посортированый. Но list.get(0) and list.remove(0) - операция очень затратная.
0
|
|
| 06.10.2018, 03:56 | |
|
Помогаю со студенческими работами здесь
12
Реализация с интерфейсом Comparable Comparator Comparator Как реализовать Интерфейс Comparable Интерфейс Comparable для шаблонов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Почему дизайн решает?
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
Пост отсюда. . .
|