С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
88 / 86 / 55
Регистрация: 14.11.2015
Сообщений: 1,099

Comparable vs Comparator

14.11.2016, 21:50. Показов 2072. Ответов 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
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.11.2016, 21:50
Ответы с готовыми решениями:

Интерфейс Comparable
Создайте класс Faculty, включающий два строковых и одно числовое поле. Создайте массив объектов данного класса, заполнив значения полей с...

Интерфейс Comparable
Учу Java и наткнулся на этот интерфейс. Он имеет всего один метод compareTo(), так как это интерфейс, то мы должны его реализовать. В...

Comparable в Array
Доброго времени суток! :) Есть всем знакомый класс Person: public class Person implements Comparable<Person>, Cloneable { ...

11
 Аватар для shilko2013
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
 Аватар для shilko2013
257 / 234 / 185
Регистрация: 02.04.2016
Сообщений: 898
15.11.2016, 07:29
Мне кажется, надо смотреть на класс. Если это MyString, например, то надо сделать его comparable, так как обычно строки стравниваются по алфавиту. Для класса Person Comparable реализовывать не надо, так как фиг знает кто по какому полю захочет сортировать. Поэтому используем Comporator.
1
 Аватар для HighPredator
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
15.11.2016, 09:16
Отвечу чуть по-другому.
Comparator -- когда нужно сравнить два объекта (м.б. вполне инстансы других абсолютно классов). То есть:
Java
1
2
3
4
5
6
public class PlanetComparator implements Comparator<Planet> {
  @Override
  public int compare(Planet planet1, Planet planet2) {
    // сравниваем планеты
  }
}
Comparable -- когда объект должен иметь возможность сравнения себя с другим объектом этого же класса.
Java
1
2
3
4
5
6
public class Planet implements Comparable<Planet> {
  @Override
  public int compareTo(Planet otherPlanet) {
    // сравниваем планету с другой
  }
}
1
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
05.10.2018, 12:31
У меня какая то странная проблема с генерик компаратором:
Java
1
2
3
4
5
6
7
8
9
10
11
Public class TeamQueue {
Comparator teamComparator;
teamComparator = new Comparator<Team>() {
    //@Override
    public int compare(Team t1, Team t2) {
                  String a1=t1.getName();
                  String a2=t2.getName(); 
                  return a1.compareTo(a2);
         // return t1.getName().compareTo(t2.getName());
            }
        };
Ship.java:24: error: cannot find symbol
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-ой строке написано. Так же поменяйте объявление переменной на:
Java
1
Comparator<Team> teamComparator;
0
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
05.10.2018, 18:49
Нет дело не в том: у меня ссылка так и приведена. Да и сообщение касается видимости метода - Team.
Вот если прямо определять класс
Java
1
2
3
class TeamComparator implements Comparator<Team> {
 
    public int compare(Team t1, Team t2) {
- то ошибки компилятора нету.
Если определять анонимный компаратор (в конструкторе или сеттере) - то появляется
эта ошибка -
Java
1
2
3
4
5
6
7
teamComparator = new Comparator<Team>() {
    @Override
    public int compare(Team t1, Team t2) {
                  
           return t1.getName().compareTo(t2.getName());
            }
        };
Но не знаю с чем это связано. Хотя очевидна потеря видимости публичных методов в анонимном классе.

Добавлено через 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 минуту
Java
1
2
3
public boolean add(Team team) {
        return list.add(team);
    }
-- Выходит что теперь проблема при сортировке при добавление - Правильно ли делать так -
Java
1
2
3
4
5
6
public boolean offer(Team team) {
        boolean res= list.add(team); 
        Collections.sort(list,teamComparator);
        if (res==true) return true;
        if (res==fasle) return false; //else throw new Exception(); в методе add();
    }
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,761
05.10.2018, 21:32
Цитата Сообщение от arts1 Посмотреть сообщение
Но почему class TeamComparator<Team> implements Comparator<Team> - обычный или анонимный клас не позволяет вызывать методы Team - типа что есть параметром - я не понимаю
Потому что здесь Team — это не класс Team, а имя параметра generic-типа. Это всё равно, что написать class TeamComparator<T> implements Comparator<T>
1
138 / 7 / 1
Регистрация: 31.03.2015
Сообщений: 395
05.10.2018, 21:48
Тогда что надо правильно было написать class TeamComparator<T> implements Comparator<T> - а предыдущий вариат ошибка?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,761
05.10.2018, 22:17
Цитата Сообщение от arts1 Посмотреть сообщение
Тогда что надо правильно было написать class TeamComparator<T> implements Comparator<T> - а предыдущий вариат ошибка?
Правильно писать class TeamComparator implements Comparator<Team>
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.10.2018, 03:56
Помогаю со студенческими работами здесь

Реализация с интерфейсом Comparable
Подскажите пожалуйста как правильно реализовать в Классе Megaphone сортировку с помощью интерфейса Comparable. Метод compareTo я...

Comparator
Объясните пожалуйста как работают эти методы, и если мне надо сортировать еще и по другим полям ,надо опять писать метод Arrays.sort, и...

Comparator
Есть класс User и 3 компаратора. public class User { private String name; private String login; private...

Как реализовать Интерфейс Comparable
Добрый день подскажите пожалуйста: У меня есть коллекция фильмов, фильмы содержат: название, продюсер и категорию. Класс фильм я сделала...

Интерфейс Comparable для шаблонов
Здравствуйте. Подскажите, пожалуйста, как реализовать метод сравнения для шаблона. Сравнение должно происходить по полю data. public...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Новый 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 Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru