2016-12-19 12 views
1

У меня есть ArrayList из Person объектов. A Person имеет name, age и height. Моя цель - сортировать это ArrayList<Person>. Я реализовал Comparable<Person> и определили compareTo(), но когда я пытаюсь разобраться, он дает мне эту ошибку:Java Сортировать со сравнимыми

The method sort(Comparator) in the type ArrayList is not applicable for the argument()"

Я так понимаю, что если реализовать Сопоставимые, а затем определить compareTo все остальное волшебно сделано для вас ,

Может кто-нибудь объяснить, как это работает и почему я получаю эту ошибку?

+3

Что 'Comparator' ты проходишь? Не могли бы вы поделиться каким-то кодом? – Mureinik

+0

вместо этого используйте 'Collections.sort'. Сам ArrayList не знает, как сортировать без компаратора. – njzk2

ответ

0

Либо вы используете структуру, которая использует интерфейс Comparable заказать его элементы при добавлении нового элемента внутри него:

TreeSet<Person> persons = new TreeSet<>(); 
Person personOne = ... 
Person personTwo = ... 
persons.add(personOne); 
persons.add(personTwo); 

Либо вы используете List и в Collections.sort(List<T> list) метод, который принимает в качестве аргумента список, для сортировки (есть перегрузка этого метода, но это не имеет значения в вашем случае):

List<Person> persons = new ArrayList<>(); 
Person personOne = ... 
Person personTwo = ... 
persons.add(personOne); 
persons.add(personTwo); 
Collections.sort(persons); 

с TreeSet, элементы сортируются, как только добавил и Wi th List, элементы не сортируются при их добавлении.
Только вызов метода Collections.sort() сортирует список.

2

Я думаю, что ваш код выглядит следующим образом:

ArrayList<Person> people = ...; 
people.sort(); 

Посмотрите на JavaDoc для ArrayList. Вы видите метод public void sort() (без параметров)? No - такого метода нет.

Это смысл ошибки: The method sort(Comparator) in the type ArrayList is not applicable for the argument() - Есть метод sort(Comparator), но вы не указали подходящие параметры.

Предполагая Person реализует Comparable (и, следовательно, имеет метод compareTo()), вы можете использовать Collections.sort(), рассортировывающую произвольное List<Comparable>

Collections.sort(people); 

Это потому, что Collections имеет статический метод:

static <T extends Comparable<? super T>> void sort(List<T> list); 

(он также имеет sort(List<T> list, Comparator<T> comparator))

...или вы можете передать компаратор List.sort(), что довольно легко с Java 8 лямбды:

people.sort((a,b) -> a.compareTo(b)); 

(Или, если вы предпочитаете старый стиль):

people.sort(new Comparator<String>() { 
    @Override 
    public int compare(String a, String b) { 
     return a.compareTo(b); 
    } 
}); 

(На самом деле, как в Java 8, этот компаратор предоставляется стандартной библиотекой, так как Comparator.naturalOrder())

Точка компараторов заключается в том, что вы можете сортировать в соответствии с различными критериями. Например:

people.sort((a,b) -> a.lastName().compareTo(b.lastName())); 
people.sort((a,b) -> a.lastName().compareToIgnoreCase(b.lastName())); 
people.sort((a,b) -> Integer.compare(a.age(),b.age())); 
// etc. 

... или методы, использующие в Comparator:

people.sort(Comparator.comparing(Person::lastName)); 
people.sort(Comparator.comparing(Person::lastName) 
     .thenComparing(Person::firstName)); 
+1

Зачем писать '(a, b) -> a.compareTo (b)', когда вы можете написать 'Comparator.naturalOrder()'? –

+0

@LouisWasserman Это новое для меня. Благодаря! – slim