欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中Comparable接口和Comparator接口的使用比較

 更新時間:2024年06月18日 10:48:13   作者:徐子童  
Java中提供了兩種對集合或數(shù)組中元素進行排序的方法,一種是實現(xiàn)Comparable接口,另一種是實現(xiàn)Comparator接口,下面這篇文章主要給大家介紹了關于Java中Comparable接口和Comparator接口使用的相關資料,需要的朋友可以參考下

在Java中,我們會經常使用到自定義類,那我們如何進行自定義類的比較呢?

1.Comparable接口

普通數(shù)據(jù)的比較

        int a=10;
        int b=91;
        System.out.println(a<b);

那自定義類型可不可以這樣比較呢?看一下代碼

我們發(fā)現(xiàn)會報錯,因為自定義類型,stu1和stu2里面存的是引用,是無法直接根據(jù)姓名或年齡進行比較的。

1.1Comparable接口的使用

 如果想要自定義類型根據(jù)年齡和名字進行比較,這時候就要用到我們的Comparable接口。

當我們觀察Comparable接口的底層細節(jié)會發(fā)現(xiàn)有一個<T>和一個方法,<T>代表我們要比較的類型,方法是我們根據(jù)實際情況來重寫compareTo方法,也就是比較的規(guī)則。

1.根據(jù)年齡比較 

自定義類中具體實現(xiàn)

class Student implements Comparable<Student>{
    public String name;
    public int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Student o) {
        //根據(jù)年齡比較
        /*if(this.age>o.age){
            return 1;
        }else if (this.age==o.age){
            return 0;
        }else {
            return -1;
        }*/
        return this.age-o.age;
    }
}

完整代碼

class Student implements Comparable<Student>{
    public String name;
    public int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Student o) {
        //根據(jù)年齡比較
        /*if(this.age>o.age){
            return 1;
        }else if (this.age==o.age){
            return 0;
        }else {
            return -1;
        }*/
        return this.age-o.age;
    }
}
public class Test {
    public static void main(String[] args) {
        Student stu1=new Student("zhansan",18);
        Student stu2=new Student("man",24);
        System.out.println(stu1.compareTo(stu2));
    }
}

2.根據(jù)名字比較

class Student implements Comparable<Student>{
    public String name;
    public int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public int compareTo(Student o) {
        return this.name.compareTo(o.name);
    }
}
public class Test {
    public static void main(String[] args) {
        Student stu1=new Student("zhansan",18);
        Student stu2=new Student("man",24);
        System.out.println(stu1.compareTo(stu2));
    }
}

由于名字是String類,String類在底層中也實現(xiàn)了compareTo方法,所以我們可以直接調用compareTo方法來實現(xiàn)名字的比較。

3. 多個對象之間的比較

多個對象我們可以用一個對應類的數(shù)組來存儲,然后思路就是讓數(shù)組里面的元素就行比較。

這里模擬了冒泡排序進行比較。

根據(jù)名字來排序

import java.util.Arrays;

class Student implements Comparable<Student>{
    public String name;
    public int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        return this.name.compareTo(o.name);
    }
}
public class Test {
    public static void mysort(Comparable[] comparables){
        for (int i = 0; i < comparables.length-1; i++) {
            for(int j=0;j<comparables.length-1-i;j++){
                if(comparables[j].compareTo(comparables[j+1])>0){
                    Comparable tmp=comparables[j];
                    comparables[j]=comparables[j+1];
                    comparables[j+1]=tmp;
                }
            }
        }
    }
    public static void main(String[] args) {
        Student[] students=new Student[]{
                new Student("zhansan",18),
                new Student("man",24),
                new Student("lebron",23)
        };
        mysort(students);
        System.out.println(Arrays.toString(students));

    }
}

根據(jù)年齡來排序

import java.util.Arrays;

class Student implements Comparable<Student>{
    public String name;
    public int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        return this.age-o.age;
    }
}
public class Test {
    public static void mysort(Comparable[] comparables){
        for (int i = 0; i < comparables.length-1; i++) {
            for(int j=0;j<comparables.length-1-i;j++){
                if(comparables[j].compareTo(comparables[j+1])>0){
                    Comparable tmp=comparables[j];
                    comparables[j]=comparables[j+1];
                    comparables[j+1]=tmp;
                }
            }
        }
    }
    public static void main(String[] args) {
        Student[] students=new Student[]{
                new Student("zhansan",18),
                new Student("man",24),
                new Student("lebron",23)
        };
        mysort(students);
        System.out.println(Arrays.toString(students));

    }
}

4.總結

1.當前階段如果我們想要進行自定義類型之間的比較,我們要使用Comparable接口。

2.重寫接口里面的方法是我們根據(jù)需求來決定如何重寫compareTo方法,重寫后的compareTo方法里面的具體實現(xiàn)就是我們的比較規(guī)則。

2.Comparator接口

我們發(fā)現(xiàn)當我們使用Comparable接口時并不是那么靈活,因為它實現(xiàn)的比較規(guī)則是寫死的,如果我們想要換一種比較規(guī)則,我們必須要對實現(xiàn)對比較方法里面的重新構造。

那有沒有比較靈活的比較方式呢?答案就是Comparator接口。

AgeComparator類

public class AgeComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.age- o2.age;
    }
}

NameComparator類

public class NameComparator implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.name.compareTo(o2.name);
    }
}

主函數(shù)部分

根據(jù)年齡排序

public class Test {
    public static void main(String[] args) {
        Student[] students=new Student[]{
                new Student("zhansan",18),
                new Student("man",24),
                new Student("lebron",23)
        };
        NameComparator nameComparator=new NameComparator();
        AgeComparator ageComparator=new AgeComparator();
        Arrays.sort(students,ageComparator);
        System.out.println(Arrays.toString(students));

    }
}

根據(jù)名字比較

public class Test {
    public static void main(String[] args) {
        Student[] students=new Student[]{
                new Student("zhansan",18),
                new Student("man",24),
                new Student("lebron",23)
        };
        NameComparator nameComparator=new NameComparator();
        AgeComparator ageComparator=new AgeComparator();
        Arrays.sort(students,nameComparator);
        System.out.println(Arrays.toString(students));

    }
}

這里我們定義了AgeComparator類和NameComparator類,它們都使用了Comparator這個接口,

然后在自己的類里面重寫了compareTo方法。

根據(jù)以上類實現(xiàn)的對象可以認為是比較規(guī)則,將這些對象作為sort函數(shù)的參數(shù),就可以靈活實現(xiàn)不同比較方式的轉變。

相對于Comparable接口來說,Comparator不需要改變函數(shù)內部的具體實現(xiàn)來改變比較規(guī)則,只需改變函數(shù)的參數(shù)就行了,這樣更安全也更方便。 

總結

到此這篇關于Java中Comparable接口和Comparator接口使用的文章就介紹到這了,更多相關Java Comparable和Comparator接口內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

  • 微信小程序中的openid的作用詳解

    微信小程序中的openid的作用詳解

    微信小程序作為連接用戶與服務的重要橋梁,在提升用戶體驗方面發(fā)揮著重要作用,本文章將詳細探討openid在微信小程序中的作用及其重要性,幫助開發(fā)者更好地理解和利用這一功能,優(yōu)化應用體驗并增強安全性,感興趣的朋友一起看看吧
    2025-04-04
  • SpringMVC中的常用注解和用法舉例詳解

    SpringMVC中的常用注解和用法舉例詳解

    在Spring和SpringMVC中,注解的使用大大簡化了配置,提高了代碼的可讀性和可維護性,這篇文章主要給大家介紹了關于SpringMVC中常用注解和用法的相關資料,需要的朋友可以參考下
    2024-08-08
  • java生成二維碼并且給二維碼添加logo

    java生成二維碼并且給二維碼添加logo

    這篇文章主要介紹了java生成二維碼并且給二維碼添加logo的實例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • 關于Java集合框架的總結

    關于Java集合框架的總結

    下面小編就為大家?guī)硪黄P于Java集合框架的總結。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • Maven繼承與聚合詳解及作用介紹

    Maven繼承與聚合詳解及作用介紹

    繼承關系中,分為父模塊與子模塊,父模塊也被稱為 parent 模塊,子模塊會繼承父模塊的依賴,父模塊中也可以設置依賴管理器,供子模塊選擇是否需要某些依賴
    2022-08-08
  • JAVA中String類與StringBuffer類的區(qū)別

    JAVA中String類與StringBuffer類的區(qū)別

    這篇文章主要為大家詳細介紹了JAVA中String類與StringBuffer類的區(qū)別,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Java pom.xml parent引用報錯問題解決方案

    Java pom.xml parent引用報錯問題解決方案

    這篇文章主要介紹了Java pom.xml parent引用報錯問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • SpringSecurityOAuth2 如何自定義token信息

    SpringSecurityOAuth2 如何自定義token信息

    這篇文章主要介紹了SpringSecurityOAuth2 自定義token信息的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java開發(fā)實例之圖書管理系統(tǒng)的實現(xiàn)

    Java開發(fā)實例之圖書管理系統(tǒng)的實現(xiàn)

    圖書管理的功能大體包括:增加書籍、借閱書籍、刪除書籍、查看書籍列表、退出系統(tǒng)、查找書籍、返還書籍這些,本文主要給大家介紹該系統(tǒng)的數(shù)據(jù)庫語句,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • 最新評論