1. 程式人生 > >TreeSet中的排序方式。

TreeSet中的排序方式。

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,加入左子樹。