J ava的Comparator和Comparable當需要排序的集合或數組不是單純的數字型時,通常可以使用Comparator或Comparable,以簡單的方式實作對象排序或自定義排序。
一、Comparator 強行對某個對象collection進行整體排序的比較函數,可以将Comparator傳遞給Collections.sort或Arrays.sort。
一個類實作了Camparable接口則表明這個類的對象之間是可以互相比較的,這個類對象組成的集合就可以直接使用sort方法排序。
Comparator可以看成一種算法的實作,将算法和資料分離,Comparator也可以在下面兩種環境下使用:
1、類的設計師沒有考慮到比較問題而沒有實作Comparable,可以通過Comparator來實作排序而不必改變對象本身
2、可以使用多種排序标準,比如升序、降序等
方式1:使用Comparable接口
public class ObjectSort {
public static void main(String[] args) {
Person[] persons = new Person[5];
persons[0] =new Person("tom","1997-04-05");
persons[1] =new Person("jack","1997-04-06");
persons[2] =new Person("bill","1997-04-07");
persons[3] =new Person("kandy","1997-05-08");
persons[4] =new Person();
person1 = new Person("tom","1997-04-05");
person2 = new Person("tom","1997-04-06");
person3= new Person("tom","1997-04-07");
list.add(person1);
list.add(person2);
list.add(person3);
ComparatorDate comparatorDate =new ComparatorDate();
//采用方式一排序
Collections.sort(list,comparatorDate);
//采用方式二排序
Collections.sort(list);
Arrays.sort(persons);
for (Person person:persons) {
System.out.println(person);
}
}
}
class Person implements Comparable<Person>{
private String name;
private String age;
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
public Person(String name,String age){
this.name = name;
this.age = age;
}
public Person(){
this("unknown", 0);
}
//重寫該類的compareTo()方法,使其按照從小到大順序排序
@Override
public int compareTo(Person o) {
Date date1, date2;
Person baseDTO1 = (Person) o1;
Person baseDTO2 = (Person) o2;
try {
date1 = format.parse(baseDTO1.getBeginDate());
date2 = format.parse(baseDTO2.getBeginDate());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
//解析出錯
return 0;
}
if(date1.before(date2)){
return -1;
}else{
return 1;
}
}
}
方式2:使用Comparator接口
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Comparator;
import java.util.Date;
public class ComparatorDate implements Comparator{
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
@Override
public int compare(Object o1, Object o2) {
Date date1, date2;
Person baseDTO1 = (Person) o1;
Person baseDTO2 = (Person) o2;
try {
date1 = format.parse(baseDTO1.getBeginDate());
date2 = format.parse(baseDTO2.getBeginDate());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
//解析出錯
return 0;
}
if(date1.before(date2)){
return -1;
}else{
return 1;
}
}
}