TreeSet
TreeSet类是实现Set接口的3个使用的类之一,是 Set 集合的实现类,因此它也具有元素唯一性和无序性,它的底层数据结构是 TreeMap 树结构,它确保元素的唯一性是通过 Compareable 接口的 compareto 方法,另外,它既是无序的,又是有序的。无序指的是存储元素顺序和输出顺序不同,有序指的是遍历集合时,输出的所有元素是有序的。
常用方法与HashSet相差无几,详情请参考java:Set集合中HashSet的常用方法及其使用
创建TreeSet集合
Set<Integer> treeset = new TreeSet<>();
TreeSet中的无序性
public static void main(String[] args) {
// 创建存储字符串的TreeSet集合
Set<String> set = new TreeSet<>();
// 添加元素
set.add("123");
set.add("aa");
set.add("a");
// 打印集合
System.out.print(set);
}
输出结果:
- [123,a,aa]
TreeSet中的有序性
添加元素到 TreeSet 集合时,TreeSet 集合会调用元素的 compareTo() 方法来比较元素之间的大小关系,并将集合元素按升序排列,这就是它的有序性,下表展示了 TreeSet 集合对各种数据类型的默认排序规则
元素类型 | 排序方式 |
---|---|
数值类型 | 按数值大小排序 |
Character类型 | 按字符的Unicode值来比较 |
Boolean类型 | true大于false |
String类型 | 按字符串中字符的unicode值进行比较 |
Date、Time类型 | 后边的时间、日期比前面的时间、日期大 |
代码演示Boolean类型:输入true false,输出false true
public static void main(String[] args) {
// 创建存储Boolean类型的TreeSet集合
Set<Boolean> set = new TreeSet<>();
// 判断集合是否为空
boolean empty = set.isEmpty();
System.out.println(empty);
// 添加元素
set.add(empty);
set.add(false);
// 打印集合
System.out.print(set);
}
输出结果:
1.false
2.[false,true]
TreeSet集合中的自定义排序(重点)
如果需要实现自定义排序,例如降序,则可以使用 Comparator 接口,该接口里包含一个 compare(T o1, T o2)方法,该方法用于比较 o1 和 o2 的大小。在创建 TreeSet 集合对象时,提供一个 Comparator 对象与该 TreeSet 集合关联,该 Comparator 对象负责集合元素的排序逻辑。
接下来将展示两种方法实现降序。
第一种:匿名内部类实现
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class Testdemo {
public static void main(String[] args) {
Set<Integer> t = new TreeSet<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
return o2 - o1;
}
});
t.add(55);
t.add(45);
t.add(50);
Iterator<Integer> iterator = t.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
输出结果:
- 55
- 50
- 45
第二种,自定义类实现Comparator
import java.util.*;
// 自定义类实现Comparator
class DescSort implements Comparator<Integer> {
// 重写compare方法
public int compare(Integer s1, Integer s2) {
// 如果第一个数大于第二个数,返回负数,默认为正数
if (s1.compareTo(s2) > 0)
return -1;
// 如果第一个数小于第二个数,返回正数,默认为负数
else if (s1.compareTo(s2) < 0)
return 1;
// 如果第一个数等于第二个数,返回0
else
return 0;
}
}
public class tt {
public static void main(String[] args) {
// 创建存储整数的TreeSet集合
Set<Integer> set = new TreeSet<>();
// 创建Comparator对象
Comparator<Integer> comp = new DescSort();
// 把Comparator对象与TreeSet对象关联
set = new TreeSet<Integer>(comp);
// 添加元素
for (int i = 9; i < 14; i++)
set.add(i);
// 打印集合
System.out.print(set);
}
}
输出结果:
- [13, 12, 11, 10, 9]