5 回答

TA貢獻1818條經驗 獲得超3個贊
自從Date
實現以來Comparable
,它有一個compareTo
類似的方法String
。
所以你的自定義Comparator
可能如下所示:
public class CustomComparator implements Comparator<MyObject> { @Override public int compare(MyObject o1, MyObject o2) { return o1.getStartDate().compareTo(o2.getStartDate()); }}
該compare()
方法必須返回一個int
,所以你無法直接返回boolean
你計劃的那樣。
你的排序代碼就像你寫的那樣:
Collections.sort(Database.arrayList, new CustomComparator());
如果你不需要重用你的比較器,寫一個稍微短一點的方法是將它寫成內聯匿名類:
Collections.sort(Database.arrayList, new Comparator<MyObject>() { @Override public int compare(MyObject o1, MyObject o2) { return o1.getStartDate().compareTo(o2.getStartDate()); }});
自java-8
您現在可以使用lambda表達式以更短的形式編寫最后一個示例Comparator
:
Collections.sort(Database.arrayList, (o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
并且List
有一個sort(Comparator)
方法,所以你可以進一步縮短它:
Database.arrayList.sort((o1, o2) -> o1.getStartDate().compareTo(o2.getStartDate()));
這是一個常見的習慣用法,有一個內置的方法來生成一個Comparator
帶有Comparable
鍵的類:
Database.arrayList.sort(Comparator.comparing(MyObject::getStartDate));
所有這些都是等效的形式。

TA貢獻1797條經驗 獲得超6個贊
對于排序,ArrayList您可以使用以下代碼段:
Collections.sort(studList, new Comparator<Student>(){
public int compare(Student s1, Student s2) {
return s1.getFirstName().compareToIgnoreCase(s2.getFirstName());
}
});

TA貢獻1810條經驗 獲得超5個贊
是的你可以。比較項目有兩個選項:Comparable接口和Comparator接口。
這兩種接口都允許不同的行為。Comparable允許您使對象的行為與您剛剛描述的Strings一樣(事實上,String實現了Comparable)。第二個,比較器,允許你做你想要做的事情。你會這樣做:
Collections.sort(myArrayList, new MyComparator());
這將導致Collections.sort方法將比較器用于它的排序機制。如果ArrayList中的對象具有可比性,則可以執行以下操作:
Collections.sort(myArrayList);
該集合類包含了一些這些有用的,常用工具。

TA貢獻2003條經驗 獲得超2個贊
JAVA 8 lambda表達式
Collections.sort(studList, (Student s1, Student s2) ->{
return s1.getFirstName().compareToIgnoreCase(s2.getFirstName());
});
要么
Comparator<Student> c = (s1, s2) -> s1.firstName.compareTo(s2.firstName);
studList.sort(c)
添加回答
舉報