Я научился использовать comparable, но у меня возникли трудности с Comparator. У меня ошибка в моем коде:
Exception in thread "main" java.lang.ClassCastException: New.People cannot be cast to java.lang.Comparable at java.util.Arrays.mergeSort(Unknown Source) at java.util.Arrays.sort(Unknown Source) at java.util.Collections.sort(Unknown Source) at New.TestPeople.main(TestPeople.java:18)
classLexicographicComparatorimplementsComparator<Person> { @Override publicintcompare(Person a, Person b) { return a.name.compareToIgnoreCase(b.name); } }
classAgeComparatorimplementsComparator<Person> { @Override publicintcompare(Person a, Person b) { return a.age < b.age ? -1 : a.age == b.age ? 0 : 1; } }
Вот очень короткий шаблон для выполнения сортировки сразу :
Collections.sort(people, newComparator<Person>() { @Override publicintcompare(final Person lhs, Person rhs) { // TODO return 1 if rhs should be before lhs // return -1 if lhs should be before rhs // return 0 otherwise (meaning the order stays the same) } });
Если это трудно запомнить, попробуйте просто запомнить, что это похоже (с точки зрения знака числа) на:
lhs-rhs
Это на случай, если вы хотите выполнить сортировку в порядке возрастания: от наименьшего числа к наибольшему.
Ответ 3
Используйте People implements Comparable<People> вместо этого; это определяет естественный порядок для People.
A Comparator<People> также может быть определен дополнительно, но People implements Comparator<People> это неправильный способ выполнения действий.
Две перегрузки для Collections.sort различны:
<T extends Comparable<? super T>> void sort(List<T> list)
Сортирует Comparable объекты, используя их естественный порядок
<T> void sort(List<T> list, Comparator<? super T> c)
Сортирует все, что угодно, используя совместимый Comparator
Вы путаете эти два параметра, пытаясь отсортировать Comparator (опять же, поэтому это не имеет смысла Person implements Comparator<Person>). Опять же, для использования Collections.sort вам нужно, чтобы одно из этих значений было истинным:
Тип должен быть Comparable (используйте 1 аргумент sort)
Должно быть указано Comparator для типа (используйте 2 аргумента sort)
Затем вы обнаружите, что ваш код даже не компилируется !! Это было бы хорошо, потому что с кодом что-то не так (Person не делает implements Comparable<Person>), но поскольку вы использовали необработанный тип, компилятор не проверил это, и вместо этого вы получаете ClassCastException во время выполнения!!!
Это должно убедить вас всегда использовать типобезопасные универсальные типы в новом коде. Всегда.