2016-12-19 105 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