天天看點

Comparable和Comparator接口比較

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;

}

}

}