TreeSet中的排序方式。
阿新 • • 發佈:2018-11-13
TreeSet:可以對集合中的元素進行排序,是不同步的,資料結構為二叉樹。判斷元素唯一性的方式,就是根據比較方法返回結果是否為0,是0,就相同,不存。
TreeSet對元素進行排序的方式一:讓元素自身具備比較功能,即讓元素實現Comparable介面,覆蓋compare方法。TreeSet對元素進行排序的方式二:讓集合本身具備比較功能,定義一個類實現comparator介面,覆蓋compare方法,讓該類物件作為引數傳遞給TreeSet集合的建構函式。
首先我們來看如果沒有實現Comparable或者comparator,將物件存入TreeSet會發生什麼。
TreeSet<Student> tSet=new TreeSet<>(); tSet.add(new Student("wujie", 28)); tSet.add(new Student("wujie1", 27)); Iterator<Student> iterator=tSet.iterator(); while(iterator.hasNext()){ Student student=(Student)iterator.next(); System.out.println(student.getName()+"..."+student.getAge()); }
控制檯輸出:Exception in thread "main" java.lang.ClassCastException: firstday.Student cannot be cast to java.lang.Comparable。也就是我們的Student沒有實現COmparable,所以treeset並不知道如何去排序。
我們看api中對comparable介面的定義:此介面強行對實現它的每個類的物件進行整體排序。這種排序被稱為類的自然排序,類的compareTo方法稱為自然比較法。
所以在Student類中實現自定義的comparable方法,如果返回0,兩個物件相等,後一個物件不存入。
@Override
public int compareTo(Object arg0) {
Student student=(Student)arg0;
int temp=this.age-student.age;
return temp==0?this.name.compareTo(student.name):temp;
//return 0;
}
還有第二種方式在什麼時候使用呢?如果不要按照物件中具備的自然順序進行排序,或者物件中不具備自然順序的時候,我們可以使TreeSet集合自身具備比較功能。即定義一個類實現comparator介面,覆蓋compare方法,讓該類物件作為引數傳遞給TreeSet集合的建構函式。
public class Comparator implements java.util.Comparator {
@Override
public int compare(Object arg0, Object arg1) {
Student s1=(Student)arg0;
Student s2=(Student)arg1;
int temp0=s1.getName().compareTo(s2.getName());
return temp0==0?s1.getAge()-s2.getAge():temp0;
}
在將比較器傳給集合的構造引數
TreeSet<Student> tSet=new TreeSet<>(new Comparator());
當比較器和元素自身的comparable同時存在時,以比較器為主。實際開發中比較器也常用,
最後,上文提到treeset的資料結構為二叉樹,也就是通過比較器比較,如果為0,則元素不加入,如果大於0,加入右子樹,小於0,加入左子樹。