天天看點

Java集合架構14:TreeSet集合

TreeSet集合介紹

TreeSet是Sorted接口的實作類,正如SortedSet名字所暗示的,TreeSet可以確定集合元素處于排序狀态(根據元素的實際)。與HashSet集合相比,TreeSet還提供了如下幾個方法.

1、Comparator comparator():如果TreeSet采用了定制排序,則該方法傳回定制排序所使用的Comparator;如果TreeSet采用了自然排序,則傳回null。

2、Object first():傳回集合中的第一個元素。

3、Object last():傳回集合中的最後一個元素。

4、Object lower(Object e):傳回集合中位于指定元素之前的元素(即小于指定元素的最大元素,參考元素不需要是TreeSet集合裡的元素)。

5、Object higher(Object e):傳回集合中位于指定元素之後的元素(即大于指定元素的最小元素,參考元素不需要是ThreeSet集合裡的元素)。

6、SortedSet subSet(Object fromElement,Object toElement):傳回此Set的子集合,範圍從fromElement(包含)到toElement(不包含)。

7、SortedSet headSet(Object toElement):傳回此Set的子集,由大小toElement的元素組成。

8、SortedSet tailSet(Object fromElement):傳回此Set的子集,由大小或等于fromElement的元素組成。

排序的使用方式

(1)自然排序(Comparable)

TreeSet類的add()方法中會把存入的對象提升為Comparable類型,調用對象的comparaTo()方法和集合中的對象比較,根據compareTo()方法傳回的結果進行存儲。

public class Demo3_TreeSet {
     public static void main(String[] args) {
          TreeSet<Person> ts = new TreeSet<>();
          ts.add(new Person("張三",23));
          ts.add(new Person("李四",13));
          ts.add(new Person("李四1",13));
          ts.add(new Person("王五",43));
          ts.add(new Person("趙六",33));
          System.out.println(ts);
     }
}
           
public class Person implements Comparable<Person> {
     
     private String name;
     private int age;
     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 int compareTo(Person o) {
          int length = this.name.length() - o.name.length();//比較長度為主要條件
          int num = length == 0 ? this.name.compareTo(o.name) : length;//比較内容為次要
          return num == 0 ? this.age - o.age : num;//比較年齡為次要條件
     }
}
           

(2)比較器順序

建立TreeSet的時候可以制定一個Comparator,如果傳入了Comparator的子類對象,那麼TreeSet就會按照比較器中的順序排序,add()方法内部會自動調用Comparator接口中的compare()方法排序。調用的對象是compare方法的第一個參數,集合中的對象是compare方法的第二個參數。

package set;
import java.util.Comparator;
import java.util.TreeSet;
public class Demo3_TreeSet {
	/**
	 * TreeSet集合是用來對象元素進行排序的,同樣他也可以保證元素唯一
	 * 當CompareTo方法傳回0的時候集合中隻有一個元素
	 * 當CompareTo方法傳回正數的時候集合會怎麼存就怎麼取
	 * 當CompateTo方法傳回負數的時候集合會倒序存儲
	 */
	public static void main(String[] args) {
		TreeSet<String> ts = new TreeSet<>(new CompareByLen());
		ts.add("aaaaaa");
		ts.add("xiao");
		ts.add("z");
		ts.add("wc");
		ts.add("qqqqqqqqqq");
		System.out.println(ts);
	}
}

class CompareByLen implements Comparator<String>{

	@Override
	public int compare(String s1, String s2) {
		System.out.println(s1 + " :" + s2);
		int num = s1.length() - s2.length();
		return num == 0 ? s1.compareTo(s2) : num;
	}
	
}

           

運作結果如下:

Java集合架構14:TreeSet集合

(3)兩種方式的差別

TreeSet構造函數什麼都不傳,預設按照類中Comparable中的順序(沒有就報錯ClassCastException)。

TreeSet構造函數如果傳入Comparator,就優先按照Comparator。

注意:TreeSet隻能添加同一中類型的對象。當把一個對象加入TreeSet集合中時,TreeSet調用該對象的compareTo(Object obj)方法與容器中的其他對象比較大小,然後根據紅黑樹結構找到它的存儲位置。如果兩個對象通過compareTO(Object obj)方法比較相等,新對象将無法添加到TreeSet集合中。

TreeSet注意點

(1)添加到TreeSet集合中的對象的類必須實作Comparable接口,否則程式将會抛出ClassCastExcepton異常,代碼示範:

package Collection;
import java.util.TreeSet;
public class Demo1_TreeSet {
	public static void main(String[] args) {
		TreeSet ts = new TreeSet();
		ts.add(new Error());
	}
}
class Error {
}
           

運作結果如下:

Java集合架構14:TreeSet集合

(2)向TreeSet中添加的對象必須為同一類的對象,否則将會抛出ClassCastException異常,代碼示範如下:

package Collection;
import java.util.Date;
import java.util.TreeSet;
public class Demo1_TreeSet {
	public static void main(String[] args) {
		TreeSet ts = new TreeSet();
		ts.add(new String("asd"));
		ts.add(new Date());
	}
}
           

運作結果如下:

Java集合架構14:TreeSet集合