1. 程式人生 > >【TreeSet】自然排序與比較器排序

【TreeSet】自然排序與比較器排序

1.自然排序

物件類:
public class Examinee implements Comparable{//實現介面
	private int scorce;

	//構造方法與get、set方法略

	@Override
	public String toString() {
		return this.getScorce()+"";
	}
	/**
	 * 重寫的compareTo方法
	 */
	@Override
	public int compareTo(Examinee o) {
		return o.getScorce() - this.getScorce();
	}
}

測試類:

import java.util.TreeSet;

public class TreeSetTest {

	public static void main(String[] args) {
		//TreeSet自然排序
		TreeSet ts = new TreeSet();
		
		ts.add(new Examinee(66));
		ts.add(new Examinee(93));
		ts.add(new Examinee(52));
		ts.add(new Examinee(75));
		ts.add(new Examinee(83));
		
		System.out.println(ts);//[93, 83, 75, 66, 52]
	}

}

要點:使用TreeSet自然排序法時需要實現Comparable介面,並將泛型注為當前物件類,然後重寫compareTo();方法。

關於compareTo方法的使用方法:

@override

public int compareTo(類名 形參){

return 形參.返回int型別的方法 - this.與前面相同的方法;

//從大到小排序。若從小到大隻需交換減數與被減數

}

2.比較器排序

物件類:

public class Examinee{//不實現介面
	private int scorce;

    //構造方法與get、set方法略
	
	@Override
	public String toString() {
		return this.getScorce()+"";
	}
	/**
	 * 不在此重寫compareTo方法。適用於不允許修改,無法實現Comparable介面的類
	 */
}
測試類:
import java.util.Comparator;
import java.util.TreeSet;

public class TreeSetTest {

	public static void main(String[] args) {
		//TreeSet比較器排序
		TreeSet ts = new TreeSet(new Comparator() {
			//使用匿名內部類
			@Override
			public int compare(Examinee o1, Examinee o2) {
				return o1.getScorce() - o2.getScorce();
			}
		});
		
		ts.add(new Examinee(66));
		ts.add(new Examinee(93));
		ts.add(new Examinee(52));
		ts.add(new Examinee(75));
		ts.add(new Examinee(83));
		
		System.out.println(ts);//[52, 66, 75, 83, 93]
	}
}

要點:使用TreeSet比較器排序法時不需要實現Comparable介面,只在新建TreeSet時使用匿名內部類重寫compareTo方法即可。當物件類為Java內部類或其他沒有修改許可權的類時可以使用此方法。效果與自然排序相同。在重寫compareTo方法時要注意兩個形參屬性相減的順序。

TreeMap的key排序操作同理。

關於匿名內部類可以參考http://blog.csdn.net/spixii/article/details/52336883