天天看點

java Comparator接口和Comparable接口的個人見解

#相同點

這兩個接口都是用來排序的,例如數組的方法Arrays.sort(),對集合進行排序的方法Collections.sort() 。

#不同點

Comparable接口是用來給實作這個接口的類,自己排序,重點是給自己 。

Comparator接口是用來給其他類對象進行排序的,重點是給他人 。

#Comparable例子

首先定義一個類實作了Comparable接口 ,類名叫Comparable_Example

package Sort;

public class Comparable_Example implements Comparable<Comparable_Example> {
    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    private int number;


    public Comparable_Example(int number) {
        this.number=number;
    }

    //按照古典類型排序
    //傳回正數 ,右邊在上,左邊在下
    //傳回0 相等
    //傳回負數 ,右邊在下 ,左邊在上
    /**
     * @param o   就代表在排序時候,本身類的其他執行個體,将自身與其他執行個體進行比較
     * @return  傳回正實數就是大于,0代表等于,負實數代表小于
     */
 @Override
    public int compareTo(Comparable_Example o) {
        return this.number-o.getNumber();
    }
}

           

再定義一個沒有實作接口的普通類Normal

package Sort;

public class Normal {
    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    private int number;

    public Normal(int number) {
        this.number = number;
    }
}

           

接着在主函數裡面建立數組,并添加資料,

首先用數組Arrays.sort()方法排序

//首先是數組排序
        Comparable_Example[] comparable_examples=new Comparable_Example[10];
        //随機數 随機生成0到100的int值
        Random random=new Random();
        for (int i = 0; i <10 ; i++) {
              comparable_examples[i]=new Comparable_Example(random.nextInt(100));
        }
        //未排序前
        for (int i = 0; i <comparable_examples.length ; i++) {
            System.out.println(comparable_examples[i].getNumber());
        }
        System.out.println("排序後");
        Arrays.sort(comparable_examples);
        for (int i = 0; i <comparable_examples.length ; i++) {
            System.out.println(comparable_examples[i].getNumber());
        }
           
java Comparator接口和Comparable接口的個人見解

如果你對一個沒有實作Comparable接口的類的數組,或者類的集合,也用Arrays.sort()方法則會抛出異常

Exception in thread "main" java.lang.ClassCastException: Sort.Normal cannot be cast to java.base/java.lang.Comparable
	at java.base/java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
	at java.base/java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
	at java.base/java.util.Arrays.sort(Arrays.java:1248)
	at Sort.Sort.main(Sort.java:31)
           

如果是集合則用Collections.sort()方法

List<Comparable_Example> comparable_exampleList=new ArrayList<Comparable_Example>();
        //随機數 随機生成0到100的int值
        Random random=new Random();
        for (int i = 0; i <10 ; i++) {
           comparable_exampleList.add(new Comparable_Example(random.nextInt(100)));
        }
        System.out.println("集合排序後");
        Collections.sort(comparable_exampleList);
         comparable_exampleList.forEach(e-> System.out.println(e.getNumber()));
    }
           

運作結果

java Comparator接口和Comparable接口的個人見解

#Comparator接口例子

直接上代碼,對上個例子中的Normal類集合或數組進行排序

List<Normal> normals=new ArrayList<Normal>();
        Random random=new Random();
        for (int i = 0; i <10 ; i++) {
            normals.add(new Normal(random.nextInt(100)));
        }

        //重點代碼
        Collections.sort(normals, new Comparator<Normal>() {
            @Override
            public int compare(Normal o1, Normal o2) {
            //傳回正數 代表第一個參數o1 大于第二個參數o2
            //傳回 0    代表兩個參數等于
            //傳回負數 代表第一個參數o1 小于第二個參數o2
                return o1.getNumber()-o2.getNumber();
            }
        });
        System.out.println("排序後");
        normals.forEach(e-> System.out.println(e.getNumber()));
    }
           
java Comparator接口和Comparable接口的個人見解

上面那個也可以用Lambda表達式寫

如果你對Lambda表達式有疑問的話,可以參考我的Lambda教程

https://blog.csdn.net/a1064072510/article/details/80947286