Comparator比較器 、Comparable接口

Comparator接口比較器

Collections工具集中的sort()
 public static <T> void sort(List<T> list)     
 public static <T> void sort(List<T> list,Comparator<? super T> c)

  Comparator接口在java.util包下面,排序是Comparator須要實現的功能之一,該接口表明的是是一個比較器,比較器具備可比性,能夠作排序的,本質其實比較兩個對象誰排在前邊誰排在後邊。那麼比較的方法是:java

public int compare(Object o1,Object o2):比較兩個參數的的順序
    兩個對象比較的結果有三種:大於,等於,小於
    若是要按照升序排序:則o1小於o2返回(負數),相等返回0,o1大於o2返回(正數)
    若是要按照降序排序:則o1小於o2返回(正數),相等返回0,o1大於o2返回(負數)
    簡化操做:
    		升序排序: o1-o2
             降序排序: o2-o1
public static void main(String[] args) {
    //public static <T> void sort(List<T> list)     
    ArrayList<String> list = new ArrayList<>();
    list.add("abc");
    list.add("cba");
    list.add("bca");
    list.add("sba");
    list.add("nba");
    // 排序規則,按照字符串的第一個字母降序排序
    // 使用接口中的方法:
    // public static <T> void sort(List<T> list,Comparator<? super T> c)  
    // public int compare(Object o1,Object o2):比較兩個參數的的順序
    Collections.sort(list,new Comparator(){
        @Override
		public int compare(String o1,Strng o2) {
            /*if(o2.charAt(0) - o1.charAt(0) > 0){
                return 1;
            } else if ( o2.charAt(0) - o1.charAt(0) == 0){
                return 0;
            } else {
                return -1;
            }*/
            return o2.charAt(0) - o1.charAt(0);
        }
    });
    System.out.println(list);
}
// 控制檯結果:
[sba,nba,cba,bca,abc]
簡述Comparable和Comparator兩個接口的區別

  Comparable:強行對實現它的每一個類對象進行總體排序。這種排序咱們通常把它稱之爲天然排序,類的compareTo方法被稱之爲它的天然比較方法。只能在類中實現compareTo方法一次,不能常常修改類的代碼實現本身想要的排序。實現此接口的對象列表(和數組)能夠經過Collections.sort()(和Arrays.sort())進行自動排序,對象能夠用做有序映射中的鍵或者有序集合中的元素,無需指定比較器。數組

  Comparator:強行對某個對象進行總體排序。能夠將Comparator傳遞給sort()方法(如Collections.sort()後者Arrays.sort()),從而容許在排序順序上實現精確控制。還可使用Comparator來控制某些數據結構(有序的set或者是有序的映射)的順序,或者爲那些沒有天然順序的對象Collection提供排序。數據結構

public class Student{
    private String name;
    private int age;
    // get和set方法
    // toString方法
    // 無參構造和全參構造
}
public class MainClass {
    public static void main(String[] args) {
        // 假如學生都是老外 名字都是字母
        ArrayList<Student> list = new ArrayList<>();
        list.add(new Student("tom",20));
        list.add(new Student("lily",18));
        list.add(new Student("jack",26));
        list.add(new Student("rose",40));
        list.add(new Studeng("smith",26));
        // 按照年齡升序排序
        // 若是年齡相同的話,而後按照姓名排序,按照姓名的首字母降序排序
        Collections.sort(list,new Comparator(){
            @Override
            public int compare(Student o1,Student o2) {
               int num  = o1.getAge() - o2.getAge();
                if( num == 0) {
                    num = o2.getName().charAt(0) - o1.getName().charAt(0);
                }
                   return num;
            }
        })
        System.out.println(list);  
    }  
}
// 控制檯輸出的結果:
[Student("lily",18),Student("tom",20),Student("jack",26),Student("rose",40)]
// 二次控制檯輸出結果:
[Student("lily",18),Student("tom",20),Studeng("smith",26),Student("jack",26),Student("rose",40)]
相關文章
相關標籤/搜索