1. 程式人生 > >TreeSet方法之一 當向TreeSet中新增Person物件 續 確定按哪個屬性排序

TreeSet方法之一 當向TreeSet中新增Person物件 續 確定按哪個屬性排序

package andycpp;

public class Person implements Comparable {
	private String name;
	private Integer age;
	//get set 方法
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	//無參構造器
	public Person() {
		super();
	}
	//帶參構造器
	public Person(String name, Integer age) {
		super();
		this.name = name;
		this.age = age;
	}
	//toString
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((age == null) ? 0 : age.hashCode());
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age == null) {
			if (other.age != null)
				return false;
		} else if (!age.equals(other.age))
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
	//重寫了未實現的抽象方法,方法實現了什麼功能:就是你希望按照哪個屬性來排列
	//當向TreeSet中新增Person類的物件時,依據此方法,確定按照哪個屬性排列
	//Person有兩個屬性name,age,這裡按照age 排序
	
	@Override
	public int compareTo(Object o) {
		if(o instanceof Person){ //保證是Person型別的
			Person p = (Person)o;
//			return this.name.compareTo(p.name);//name已經重寫了compareTo
//			return this.age.compareTo(p.age);//從小到大
			return -this.age.compareTo(p.age);//從大到小

		} 
		return 0; //如果不是這個型別,就返回0,
	}
	
}
package andycpp;

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

import org.junit.Test;

/**
 * Collection介面:
 * 		List介面
 * 				ArrayList(主要的實現類)
 * 				LinkedList(對於頻繁的插入刪除操作)
 * 				Vector(古老的實現類,執行緒安全,但效率要低於ArrayList)
 * 		Set介面	儲存無序,不可重複的元素.Set中常用的方法都是Collection下定義的。
 * 				HashSet(主要實現類)
 * 				LinkedHashSet
 * 				TreeSet
 * */
public class TestSet {
	/*
	 * TreeSet:
	 * 1,向TreeSet中新增的元素必須是同一個類的。型別相同
	 * 2,可以按照新增進集合中的元素的指定的順序遍歷。像String,包裝類等預設按照從小到大的順序遍歷。
	 * 3,當向TreeSet中新增自定義類的物件時,有兩種排序方法: 自然排序和定製排序
	 * 4,自然排序:要求自定義類實現java.lang.Comparable介面並重寫其compareTo(Object obj)方法
	 * 在此方法中,指明按照自定義類的哪個屬性進行排序。
	 * 
	 * 
	 */
	@Test
	public void testTreeSet1(){
		Set set = new TreeSet();
		/*
		 *  當Person類沒有實現Comparable介面時,當向TreeSet中新增Person物件時,報ClassCastException錯誤
		 *  
		 * */
		set.add(new Person("CC",23));
		set.add(new Person("MM",21));
		set.add(new Person("GG",25));
		set.add(new Person("JJ",24));
		set.add(new Person("DD",20));
		

		for(Object str :set){
			System.out.println(str);
		}


		
		
	}
}

輸出

Person [name=GG, age=25]
Person [name=JJ, age=24]
Person [name=CC, age=23]
Person [name=MM, age=21]
Person [name=DD, age=20]