TreeSet/TreeMap的排序規則與涉及泛型約數的解釋

首先TreeSet底層構造器實際是TreeMap(有key.value爲null);

TreeMap的底層是紅黑樹(二叉樹);

這裏並沒有分析底層,只是說明我的一些問題。

一.前置技能

  1.   排序分爲自然排序和定製排序。自然排序(按元素值大小)需該對象所屬類實現comparable<T>接口,定製排序自定義比較器實現comparator<T>接口。
  2. TreeSet/TreeMap的排序需要排序對象依賴comparable<T>接口和comparator<T>接口,基本數據包裝類已經實現了這些接口,可以直接進行排序(自然排序)。而自定義對象需實現這些接口(無論是自然排序還是定製排序)。
  3. 自定義類實現comparable<T>接口 需重寫 public int compareTo(T t){}方法;
           public int compareTo(Person o) {
    		// TODO Auto-generated method stub
    		System.out.println(this+"父類比較方法"+o);
    		int tmp=this.age-o.age;
    		return tmp==0?this.name.compareTo(o.name):tmp;
    	}

     

  4. 實現comparator<T>接口需要新建比較器實現該接口並重寫public int compare(T t1, T t2) {}方法。然後調用TreeSet的構造器:TreeSet(Comparator<?  super E>c)來完成定製排序.
    public class ComparatoByName implements Comparator<Person> {
      /*
       * 定製排序比較器
       * 可以接受父類及其子類
       */
    	public int compare(Person o1, Person o2) {
    		// TODO Auto-generated method stub
    		int  tmp=o1.getName().compareTo(o2.getName());
    		return tmp==0?o1.getAge()-o2.getAge():tmp;
    	}
    }
    
    TreeSet<Person> ts=new TreeSet<Person>(new ComparatoByName());
    //子類也可以   原因是TreeSet(Comparator<?  super E>c)
    TreeSet<Student> ts=new TreeSet<Student>(new ComparatoByName());

     

二.拓展。

    1.對於自然排序實現comparatable<T>接口的類來說,他的子類爲泛型的集合依然可以借用父類的comparaTo方法實現自然排序。因爲父類實現接口重寫方法後 子類可以繼承到這個方法。當然也可以自己重寫該方法,新的排序規則。

Q:Java_TreeSet裏面放對象,如果同時放入了父類和子類的實例對象,那比較時使用的是父類的compareTo方法,還是使用的子類的compareTo方法,還是拋異常?

P:所以在TreeSet/TreeMap中,添加對象爲父類就調用父類的compareTo方法,子類調用子類的compareTo方法

    2.對於定製排序的比較器類實現的comparator<T> 也可以接受子類類型的集合來調用該比較器實現排序,是因爲

因爲比較器的實現的接口爲Comparator<? super E> 這裏的對象? 可以是E或E的父類:比如上面的代碼中比較器實現的接口爲Person類爲父類(就是“?”)而TreeSet確實Student類子類依然可以排序成功。

   3.對於工具類Collections也內置了一個靜態方法Collections.sort();他的參數類型是

  public static <T extends Comparable<? super T>> void sort(List<T> list) {
        Collections.sort(list);
    }

這裏的泛型解釋:這裏的T類型必須實現Comparable<>接口並且可以是這個Comparable<>泛型約束的子類,使該方法在針對自定義類型時更加靈活。更多解釋在https://www.cnblogs.com/xiaomiganfan/p/5390252.html。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章