2016-12-19 70 views
1

我有一个ArrayListPerson对象。 A Person具有name,ageheight。我的目标是对此进行排序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); 

要么你使用ListCollections.sort(List<T> list)方法,其采用作为参数列表你要排序(有这个方法的重载,但它是不相关的,你的情况):

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

随着TreeSet,如添加和Wi元素被尽快整理在List中,元素在添加它们时未进行排序。
只有对Collections.sort()方法的调用才能对列表进行排序。

2

我的猜测是,你的代码如下所示:

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

看的JavaDoc为ArrayList。你看到一个方法public void sort()(没有参数)? - 没有这样的方法。

这就是错误的含义: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个lambda表达式很简单:

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

为什么在写'Comparator.naturalOrder()'时写'(a,b) - > a.compareTo(b)'? –

+0

@LouisWasserman那对我来说是新的。谢谢! – slim