Comparable && Comparator 比較
阿新 • • 發佈:2020-11-29
1.自然排序Comparable的使用【應用】
-
案例需求
-
儲存學生物件並遍歷,建立TreeSet集合使用無參構造方法
-
要求:按照年齡從小到大排序,年齡相同時,按照姓名的字母順序排序
-
-
實現步驟
-
使用空參構造建立TreeSet集合
-
用TreeSet集合儲存自定義物件,無參構造方法使用的是自然排序對元素進行排序的
-
-
自定義的Student類實現Comparable介面
-
自然排序,就是讓元素所屬的類實現Comparable介面,重寫compareTo(T o)方法
-
-
重寫介面中的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
測試類
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,表示當前存入的元素跟集合中元素重複了,不存
-
如果返回值為正數,表示當前存入的元素是較大值,存右邊
資源來源: 黑馬程式設計師