1. 程式人生 > >TreeSet使用和底層原理_Comparable介面

TreeSet使用和底層原理_Comparable介面

TreeSet 底層實際是 TreeMap 實現的,內部維持了一個簡化版的 TreeMap,通過 key 來儲存 Set 的元素。 TreeSet 內部需要對儲存的元素進行排序,因此,我們對應的類需要四線 Comparable 介面。這樣才能根據 compareTo() 方法比較物件之間的大小,才能進行內部排序 (TreeMap 對key進行升序排列)

package com.jianshun;

import java.util.Set;
import java.util.TreeSet;

/**
 * 測試TreeSet
 * 熟悉Comparable介面(參考TreeMap)
 * @author Administrator
 *
 */
public class TestTreeSet {

	
	public static void main(String[] args) {
		Set<Integer> set = new TreeSet<Integer>();
		
		set.add(300);
		set.add(200);
		set.add(600);
		
		for(Integer m : set){
			System.out.println(m);
		}
		
		Set<Emp2> set2 = new TreeSet<Emp2>();
		
		set2.add(new Emp2(100,"張三",3000));
		set2.add(new Emp2(50,"李四",2000));
		set2.add(new Emp2(150,"王五",8000));		
		set2.add(new Emp2(30,"趙六",20000));
		
		for(Emp2 m : set2){
			System.out.println(m);
		}
	}
}

//當key是一個自定義物件時;
class Emp2 implements Comparable<Emp2>{
	int id;
	String name;
	double salary;

	public Emp2(int id, String name, double salary) {
		super();
		this.id = id;
		this.name = name;
		this.salary = salary;
	}
	
	public int compareTo(Emp2 o) {//負數:小於,0:等於,整數:大於
		if(this.salary > o.salary){
			return 1;
		}else if(this.salary < o.salary){
			return -1;
		}else{// salary相等在比較id
			if(this.id > o.id){
				return 1;
			}else if(this.id < o.id){
				return -1;
			}else{
				return 0;
			}
		}
	}

	@Override
	public String toString() {
		return "Emp2 [id=" + id + ", name=" + name + ", salary=" + salary + "]";
	}

}

執行結果:

200
300
600
Emp2 [id=50, name=李四, salary=2000.0]
Emp2 [id=100, name=張三, salary=3000.0]
Emp2 [id=150, name=王五, salary=8000.0]
Emp2 [id=30, name=趙六, salary=20000.0]