5.4.1 TreeSet概述
-
TreeSet 是 SortedSet 接口的实现类,TreeSet 可以按照添加的元素的指定的属性的大小顺序进行遍历。
-
TreeSet底层使用
红黑树
结构存储数据 -
新增的方法如下: (了解)
-
Comparator comparator()
-
Object first()
-
Object last()
-
Object lower(Object e)
-
Object higher(Object e)
-
SortedSet subSet(fromElement, toElement)
-
SortedSet headSet(toElement)
-
SortedSet tailSet(fromElement)
-
-
TreeSet特点:不允许重复、实现排序(自然排序或定制排序)
-
TreeSet 两种排序方法:
自然排序
和定制排序
。默认情况下,TreeSet 采用自然排序。-
自然排序
:TreeSet 会调用集合元素的 compareTo(Object obj) 方法来比较元素之间的大小关系,然后将集合元素按升序(默认情况)排列。-
如果试图把一个对象添加到 TreeSet 时,则该对象的类必须实现 Comparable 接口。
-
实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过 compareTo(Object obj) 方法的返回值来比较大小。
-
-
定制排序
:如果元素所属的类没有实现Comparable接口,或不希望按照升序(默认情况)的方式排列元素或希望按照其它属性大小进行排序,则考虑使用定制排序。定制排序,通过Comparator接口来实现。需要重写compare(T o1,T o2)方法。-
利用int compare(T o1,T o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。
-
要实现定制排序,需要将实现Comparator接口的实例作为形参传递给TreeSet的构造器。
-
-
-
因为只有相同类的两个实例才会比较大小,所以向 TreeSet 中添加的应该是
同一个类的对象
。 -
对于 TreeSet 集合而言,它判断
两个对象是否相等的唯一标准
是:两个对象通过compareTo(Object obj) 或compare(Object o1,Object o2)
方法比较返回值。返回值为0,则认为两个对象相等。
5.4.2 举例
举例1:
package com.atguigu.set;
import org.junit.Test;
import java.util.Iterator;
import java.util.TreeSet;/**
* @author 尚硅谷-宋红康
* @create 14:22
*/
public class TreeSetTest {
/*
* 自然排序:针对String类的对象
* */
@Test
public void test1(){
TreeSet set = new TreeSet();set.add("MM");
set.add("CC");
set.add("AA");
set.add("DD");
set.add("ZZ");
//set.add(123); //报ClassCastException的异常Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
/*
* 自然排序:针对User类的对象
* */
@Test
public void test2(){
TreeSet set = new TreeSet();set.add(new User("Tom",12));
set.add(new User("Rose",23));
set.add(new User("Jerry",2));
set.add(new User("Eric",18));
set.add(new User("Tommy",44));
set.add(new User("Jim",23));
set.add(new User("Maria",18));
//set.add("Tom");Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}System.out.println(set.contains(new User("Jack", 23))); //true
}
}
其中,User类定义如下:
/**
* @author 尚硅谷-宋红康
* @create 14:22
*/
public class User implements Comparable{
String name;
int age;
public User() {
}
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
/*
举例:按照age从小到大的顺序排列,如果age相同,则按照name从大到小的顺序排列
* */
public int compareTo(Object o) {
if(this == o){
return 0;
}if(o instanceof User){
User user = (User)o;
int value = this.age - user.age;
if(value != 0){
return value;
}
return -this.name.compareTo(user.name);
}
throw new RuntimeException("输入的类型不匹配");
}
}
举例2:
/*
* 定制排序
* */
@Test
public void test3(){
//按照User的姓名的从小到大的顺序排列
Comparator comparator = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof User && o2 instanceof User){
User u1 = (User)o1;
User u2 = (User)o2;return u1.name.compareTo(u2.name);
}
throw new RuntimeException("输入的类型不匹配");
}
};
TreeSet set = new TreeSet(comparator);set.add(new User("Tom",12));
set.add(new User("Rose",23));
set.add(new User("Jerry",2));
set.add(new User("Eric",18));
set.add(new User("Tommy",44));
set.add(new User("Jim",23));
set.add(new User("Maria",18));
//set.add(new User("Maria",28));Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}