1. 程式人生 > 實用技巧 >Comparable && Comparator 比較

Comparable && Comparator 比較

1.自然排序Comparable的使用【應用】

  • 案例需求

    • 儲存學生物件並遍歷,建立TreeSet集合使用無參構造方法

    • 要求:按照年齡從小到大排序,年齡相同時,按照姓名的字母順序排序

  • 實現步驟

    1. 使用空參構造建立TreeSet集合

      • 用TreeSet集合儲存自定義物件,無參構造方法使用的是自然排序對元素進行排序的

    2. 自定義的Student類實現Comparable介面

      • 自然排序,就是讓元素所屬的類實現Comparable介面,重寫compareTo(T o)方法

    3. 重寫介面中的compareTo方法

      • 重寫方法時,一定要注意排序規則必須按照要求的主要條件和次要條件來寫

  • 程式碼實現

    學生類

    public class Student implements Comparable<Student>{
        private String name;
        private int age;
    ​
        public Student() {
        }
    ​
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    ​
        public String getName() {
            return
    name; } ​ public void setName(String name) { this.name = name; } ​ public int getAge() { return age; } ​ public void setAge(int age) { this.age = age; } ​ @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } ​ @Override
    public int compareTo(Student o) { //按照物件的年齡進行排序 //主要判斷條件: 按照年齡從小到大排序 int result = this.age - o.age; //次要判斷條件: 年齡相同時,按照姓名的字母順序排序 result = result == 0 ? this.name.compareTo(o.getName()) : result; return result; } }

    測試類

    public class MyTreeSet2 {
        public static void main(String[] args) {
            //建立集合物件
            TreeSet<Student> ts = new TreeSet<>();
            //建立學生物件
            Student s1 = new Student("zhangsan",28);
            Student s2 = new Student("lisi",27);
            Student s3 = new Student("wangwu",29);
            Student s4 = new Student("zhaoliu",28);
            Student s5 = new Student("qianqi",30);
            //把學生新增到集合
            ts.add(s1);
            ts.add(s2);
            ts.add(s3);
            ts.add(s4);
            ts.add(s5);
            //遍歷集合
            for (Student student : ts) {
                System.out.println(student);
            }
        }
    }

2.比較器排序Comparator的使用【應用】

  • 案例需求

    • 儲存老師物件並遍歷,建立TreeSet集合使用帶參構造方法

    • 要求:按照年齡從小到大排序,年齡相同時,按照姓名的字母順序排序

  • 實現步驟

    • 用TreeSet集合儲存自定義物件,帶參構造方法使用的是比較器排序對元素進行排序的

    • 比較器排序,就是讓集合構造方法接收Comparator的實現類物件,重寫compare(T o1,T o2)方法

    • 重寫方法時,一定要注意排序規則必須按照要求的主要條件和次要條件來寫

  • 程式碼實現

    老師類

    public class Teacher {
        private String name;
        private int age;
    ​
        public Teacher() {
        }
    ​
        public Teacher(String name, int age) {
            this.name = name;
            this.age = age;
        }
    ​
        public String getName() {
            return name;
        }
    ​
        public void setName(String name) {
            this.name = name;
        }
    ​
        public int getAge() {
            return age;
        }
    ​
        public void setAge(int age) {
            this.age = age;
        }
    ​
        @Override
        public String toString() {
            return "Teacher{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }

    測試類

    public class MyTreeSet4 {
        public static void main(String[] args) {
            //建立集合物件
            TreeSet<Teacher> ts = new TreeSet<>(new Comparator<Teacher>() {
                @Override
                public int compare(Teacher o1, Teacher o2) {
                    //o1表示現在要存入的那個元素
                    //o2表示已經存入到集合中的元素
                  
                    //主要條件
                    int result = o1.getAge() - o2.getAge();
                    //次要條件
                    result = result == 0 ? o1.getName().compareTo(o2.getName()) : result;
                    return result;
                }
            });
            //建立老師物件
            Teacher t1 = new Teacher("zhangsan",23);
            Teacher t2 = new Teacher("lisi",22);
            Teacher t3 = new Teacher("wangwu",24);
            Teacher t4 = new Teacher("zhaoliu",24);
            //把老師新增到集合
            ts.add(t1);
            ts.add(t2);
            ts.add(t3);
            ts.add(t4);
            //遍歷集合
            for (Teacher teacher : ts) {
                System.out.println(teacher);
            }
        }
    }

3.兩種比較方式總結【理解】

  • 兩種比較方式小結

    • 自然排序: 自定義類實現Comparable介面,重寫compareTo方法,根據返回值進行排序

    • 比較器排序: 建立TreeSet物件的時候傳遞Comparator的實現類物件,重寫compare方法,根據返回值進行排序

    • 在使用的時候,預設使用自然排序,當自然排序不滿足現在的需求時,必須使用比較器排序

  • 兩種方式中關於返回值的規則

    • 如果返回值為負數,表示當前存入的元素是較小值,存左邊

    • 如果返回值為0,表示當前存入的元素跟集合中元素重複了,不存

    • 如果返回值為正數,表示當前存入的元素是較大值,存右邊

  資源來源: 黑馬程式設計師