1. 程式人生 > >Java集合框架篇-59-TreeSet儲存基本資料型別和自定義類物件

Java集合框架篇-59-TreeSet儲存基本資料型別和自定義類物件

      這篇開始,我們來學習Set介面的另外一個實現子類TreeSet。TreeSet一般是需要排序才使用的一種集合儲存方式,由於繼承了Set介面,TreeSet也能實現元素的唯一。下面通過兩個練習來理解TreeSet儲存基本的包裝類和自定義資料型別的過程。

1.TreeSet儲存Integer物件

package treeset;

import java.util.TreeSet;

public class Demo1_TreeSet {

	public static void main(String[] args) {
		TreeSet<Integer> ts = new TreeSet<>();
		ts.add(1);
		ts.add(1);
		ts.add(5);
		ts.add(5);
		ts.add(3);
		ts.add(3);
		ts.add(4);
		
		System.out.println(ts);
	}

}

執行輸出:

[1, 3, 4, 5]

      這個程式碼執行結果,證明了TreeSet是可以保證元素唯一儲存和TreeSet是預設按照元素從小到大排序。如果需要對一堆元素進行排序,那麼我們就會考慮使用TreeSet集合來儲存。

2.TreeSet儲存自定義類物件

還是利用前面用過的Person.java這個類

package bean;

public class Person {
	
	private String name;
	private int age;
	
	public Person() {
		super();
		
	}

	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

}

下面,寫一個TreeSet儲存多個Person物件。

package treeset;

import java.util.TreeSet;

import bean.Person;

public class Demo1_TreeSet {

	public static void main(String[] args) {
		TreeSet<Person> ts = new TreeSet<>();
		ts.add(new Person("張三",23));
		ts.add(new Person("李四",24));
		ts.add(new Person("王五",25));
		
		System.out.println(ts);
	}

}

      執行一下,結果報“Exception in thread "main" java.lang.ClassCastException: bean.Person cannot be cast to java.lang.Comparable”。這個異常是類轉換異常,我們先來在API中搜索看看Comparable這個介面,這個介面下有一個compareTo()方法,返回是int型別。就是一個兩個物件比較順序的方法。

      就像前面我們介紹ArrayList的時候,比較兩個自定義物件是否相同,需要重寫equals方法,那麼我們也在Person下重寫compareTo()方法試試。我們讓Person類繼承Comparable介面,然後重寫compareTo()方法。

package bean;

public class Person implements Comparable {
	
	private String name;
	private int age;
	
	public Person() {
		super();
		
	}

	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

	@Override
	public int compareTo(Object o) {
		return 0;
	}

}

     然後再次執行Demo1_TreeSet.java這個類,執行輸出:[Person [name=張三, age=23]],先不管為什麼return 0的時候只有一個元素儲存進來了。我們分別把return 0改成 reutrn 1和reutrn -1,看看有什麼效果。

1) 改成return 1,執行結果

[Person [name=張三, age=23], Person [name=李四, age=24], Person [name=王五, age=25]]

2) 改成return -1,執行結果

[Person [name=王五, age=25], Person [name=李四, age=24], Person [name=張三, age=23]]

上面的測試結果,這裡先記錄一下結論。

1)當compareTo方法返回0,集合中只有一個元素

2)當compareTo方法返回正數,集合會怎麼存就怎麼取的順序

3)當compareTo方法返回負數,集合就會倒序存取

      上面compareTo我們只測試了0 -1 和1,其實正數和負數是符合上面的結論。關於為什麼會是這樣,TreeSet的原理是什麼,下一篇介紹和學習。