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;
}
}
運作結果如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL90zZOlXS6pVdsdlYxw2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL3EzM0AzMyUTMwETMxgTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
(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 {
}
運作結果如下:
(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());
}
}
運作結果如下: