樹形結構集合中(TreeMap和TreeSet)的自然排序和比價器排序
阿新 • • 發佈:2020-08-24
在樹形結構的集合TreeMap和TreeSet中,資料的儲存的順序和用put方法放進去的順序是不一定相同的,因為樹形結構的資料儲存是根據紅黑樹的計算結果進行儲存的,所以在我們用樹形結構集合儲存一個指定型別時:那麼就需要給這個型別(也就是這個類)指定相應的排序規則(這個排序規則就是紅黑樹的計算排序法則),指定規則的方式有兩種:
一,自然排序
如果我們用樹形結構的集合儲存一個類時:比如:TreeSet<Student> treeSet=new TreeSet;
那麼我們使用自然排序的話就需要讓Student類實現Comparable<>介面(並且記得介面後面的泛型是實現類的類的型別在這類也就是Student
假如一個TreeSet集合儲存Student類:
1 package com.heima.work.demo; 2 3 public class Student implements Comparable<Student> { 4 private String name; 5 private int age; 6 7 public Student() { 8 } 9 10 public Student(String name, int age) { 11 this.name = name; 12 this.age = age; 13 } 14 15 public String getName() { 16 return name; 17 } 18 19 public void setName(String name) { 20 this.name = name; 21 } 22 23 public int getAge() { 24 return age; 25 } 26 27 public void setAge(intage) { 28 this.age = age; 29 } 30 31 @Override 32 public String toString() { 33 return "Student{" + 34 "name='" + name + '\'' + 35 ", age=" + age + 36 '}'; 37 } 38 39 @Override 40 public int compareTo(Student o) { 41 return this.age - o.age;//這是對方法的重寫年齡從小到大 42 } 43 }
測試類為:
1 package com.heima.work.demo; 2 3 import java.util.TreeSet; 4 5 public class demo01 { 6 public static void main(String[] args) { 7 TreeSet<Student> treeSet = new TreeSet<>(); 8 treeSet.add(new Student("張三", 23)); 9 treeSet.add(new Student("李四", 24)); 10 treeSet.add(new Student("王五", 26)); 11 treeSet.add(new Student("張三", 28)); 12 13 System.out.println(treeSet); 14 15 16 } 17 18 19 }
結果是:
如果我們改變排序規則,即:
1 package com.heima.work.demo; 2 3 public class Student implements Comparable<Student> { 4 private String name; 5 private int age; 6 7 public Student() { 8 } 9 10 public Student(String name, int age) { 11 this.name = name; 12 this.age = age; 13 } 14 15 public String getName() { 16 return name; 17 } 18 19 public void setName(String name) { 20 this.name = name; 21 } 22 23 public int getAge() { 24 return age; 25 } 26 27 public void setAge(int age) { 28 this.age = age; 29 } 30 31 @Override 32 public String toString() { 33 return "Student{" + 34 "name='" + name + '\'' + 35 ", age=" + age + 36 '}'; 37 } 38 39 @Override 40 public int compareTo(Student o) { 41 return o.age - this.age;//改變排序規則,從大到小 42 } 43 }
結果為:
第二種:比較器排序
自然排序是在指定類中讓其實現類繼承Comparabale介面但是如果我們有樹形集合儲存的資料型別我們我發修改或者說讓它實現Comparabale介面呢?比如說String類,這是java已經封賬好的類,我們無法對他進行自然排序的修改,針對這種情況有了第二種排序的方法:比較器排序
比較器排序是在樹形集合的構造方法中重寫Comparator<T>介面:
例子:
1 package com.heima.work.demo; 2 3 import java.util.Comparator; 4 import java.util.TreeSet; 5 6 public class demo002 { 7 public static void main(String[] args) { 8 TreeSet<Student> treeSet = new TreeSet<>(new Comparator<Student>() {//這裡就是比較器 9 @Override 10 public int compare(Student o1, Student o2) { 11 return o1.getAge() - o2.getAge(); 12 13 } 14 }); 15 treeSet.add(new Student("張三", 23)); 16 treeSet.add(new Student("李四", 24)); 17 treeSet.add(new Student("王五", 26)); 18 treeSet.add(new Student("張三", 28)); 19 20 System.out.println(treeSet); 21 22 23 } 24 }
結果是:
如果我們改變比較規則,即改變第11行程式碼的順序:
1 package com.heima.work.demo; 2 3 import java.util.Comparator; 4 import java.util.TreeSet; 5 6 public class demo002 { 7 public static void main(String[] args) { 8 TreeSet<Student> treeSet = new TreeSet<>(new Comparator<Student>() { 9 @Override 10 public int compare(Student o1, Student o2) { 11 return o2.getAge()-o1.getAge();//這裡已經改變了順序 12 13 } 14 }); 15 treeSet.add(new Student("張三", 23)); 16 treeSet.add(new Student("李四", 24)); 17 treeSet.add(new Student("王五", 26)); 18 treeSet.add(new Student("張三", 28)); 19 20 System.out.println(treeSet); 21 22 23 } 24 }
結果是:
總結就是優先選擇自然排序,在自然排序行不通的情況下使用比較器排序