Я узнал, как использовать сопоставимые, но у меня возникли трудности с 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)
Вот мой код:
import java.util.Comparator;
public class People implements Comparator {
private int id;
private String info;
private double price;
public People(int newid, String newinfo, double newprice) {
setid(newid);
setinfo(newinfo);
setprice(newprice);
}
public int getid() {
return id;
}
public void setid(int id) {
this.id = id;
}
public String getinfo() {
return info;
}
public void setinfo(String info) {
this.info = info;
}
public double getprice() {
return price;
}
public void setprice(double price) {
this.price = price;
}
public int compare(Object obj1, Object obj2) {
Integer p1 = ((People) obj1).getid();
Integer p2 = ((People) obj2).getid();
if (p1 > p2) {
return 1;
} else if (p1 < p2){
return -1;
} else {
return 0;
}
}
}
import java.util.ArrayList;
import java.util.Collections;
public class TestPeople {
public static void main(String[] args) {
ArrayList peps = new ArrayList();
peps.add(new People(123, "M", 14.25));
peps.add(new People(234, "M", 6.21));
peps.add(new People(362, "F", 9.23));
peps.add(new People(111, "M", 65.99));
peps.add(new People(535, "F", 9.23));
Collections.sort(peps);
for (int i = 0; i < peps.size(); i++){
System.out.println(peps.get(i));
}
}
}
Я считаю, что это связано с приведением в методе сравнения, но я поиграл с этим и так и не смог найти решение.
Comparator<People>
,Comparable<People>
,List<People>
и т.д.sort
. Если вам сказали использоватьComparator<People>
, то используйте 2-аргументsort
, а не 1-аргументsort
(который требуетPeople implements Comparable<People>
).Ответы:
В вашем примере класса есть несколько неловких вещей:
price
иinfo
(больше для объектов, а не для людей);В любом случае, вот демонстрация того, как использовать
Comparator<T>
:РЕДАКТИРОВАТЬ
И эквивалентная демонстрация Java 8 будет выглядеть так:
источник
a.age - b.age
int
stackoverflow.com/questions/2728793/…Comparable
вы должны выбрать один атрибут для сравнения. В случае человека есть много атрибутов, по которым можно сравнивать: возраст, длину, пол, имена и т. Д. В этом случае легко предоставить пару компараторов, которые выполняют эти сравнения.Вот супер короткий шаблон для сортировки сразу:
если трудно запомнить, попробуйте просто запомнить, что это похоже (с точки зрения знака числа) на:
Это в случае, если вы хотите отсортировать в порядке возрастания: от наименьшего числа к наибольшему числу.
источник
compare()
когда-либо.Используйте
People implements Comparable<People>
вместо этого; это определяет естественный порядок дляPeople
.А
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-argsort
)Comparator
для типа должно быть предоставлено (используйте 2-argssort
)Смежные вопросы
Кроме того, не используйте необработанные типы в новом коде . Необработанные типы являются небезопасными и предоставляются только для совместимости.
То есть вместо этого:
Вы должны были использовать обобщенное объявление типов:
Затем вы обнаружите, что ваш код даже не компилируется! Это было бы хорошо, потому что с кодом что-то не так (
Person
нетimplements Comparable<Person>
), но поскольку вы использовали raw-тип, компилятор не проверял это , и вместо этого вы получилиClassCastException
во время выполнения !!!Это должно убедить вас всегда использовать типизированные безопасные универсальные типы в новом коде. Всегда.
Смотрите также
источник
Для полноты, вот простой однострочный
compare
метод:источник
signum
Integer.compare(lhs.getId(), rhs.getId());
это лучший подход. Как упомянуто @ niraj.nijju, вычитание может вызвать переполнение.В Java 8 добавлен новый способ создания компараторов, который сокращает объем кода, который вы должны писать, Comparator.comparing . Также проверьте Comparator.reversed
Вот образец
источник
Вы хотите реализовать Comparable, а не Comparator. Вам необходимо реализовать метод CompareTo. Вы близко, хотя. Comparator - это процедура сравнения сторонних производителей. Сопоставимо то, что этот объект можно сравнить с другим.
Обратите внимание, вы можете проверить наличие нулей здесь для getId..just на всякий случай.
источник
Вот пример Comparator, который будет работать для любого метода с нулевым аргументом, который возвращает Comparable. Существует ли что-то подобное в jdk или библиотеке?
источник
Ради полноты.
Использование Java8
если ты хочешь в
descending order
источник
People::getId
?.thenComparing()
предложение, когда есть конфликт..thenComparing()
?источник
Решение можно оптимизировать следующим образом: во-первых, используйте закрытый внутренний класс, поскольку областью действия для полей должен быть включающий класс TestPeople, чтобы реализация класса People не открывалась для внешнего мира. Это можно понять с точки зрения создания API, который ожидает отсортированный список людей. Во-вторых, с использованием выражения Lamba (java 8), которое сокращает код, а значит, и усилия по разработке.
Следовательно, код будет таким, как показано ниже:
источник
Вы должны использовать перегруженный метод сортировки (peps, new People ())
источник
Вот мой ответ для простого инструмента сравнения
}
Утилита для того же
}
Колонка Инфо Класс
источник
Два исправления:
Вы должны сделать
ArrayList
изPeople
объектов:После добавления объектов в preps используйте:
Также добавьте
CompareId
класс как:источник
Не тратьте время на реализацию алгоритма сортировки самостоятельно. Вместо; использование
Collections.sort () для сортировки данных.
источник