1、TreeSet 简介
TreeSet 底层使用的数据结构是红黑树,所以TreeSet中存储的数据是有顺序的,TreeSet 支持两种排序规则,一是自然排序,二是定制排序,自然排序是默认的排序方式。
2、自然排序
JDK 中有许多类已经实现了 Comparable 接口,也就是说其有已经规定的比较规则,可以直接放入 TreeSet 中。案例代码如下:
@Test
public void test3(){
TreeSet<Integer> set = new TreeSet<>();
set.add(2);
set.add(1);
set.add(4);
set.add(3);
for (Integer integer : set) {
System.out.println(integer);
}
}
// 结果
1
2
3
4
3、定制排序
如果是自己定义的类对象需要放入TreeSet 集合,那么我们可以通过 Comparator 接口来完成。创建 Comparator 接口的匿名内部类作为创建 TreeSet 的形参,在匿名内部类中编写排序规则。
@Test
public void Test4(){
/**
* 局部内部类
*/
class Dog{
private String name;
private int age;
public Dog(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
TreeSet<Dog> dogs = new TreeSet<>(new Comparator<Dog>() {
@Override
public int compare(Dog o1, Dog o2) {
return o1.age - o2.age;
}
});
dogs.add(new Dog("Tom",2));
dogs.add(new Dog("Lily",1));
for (Dog dog : dogs) {
System.out.println(dog);
}
}
// 结果
Dog{name='Lily', age=1}
Dog{name='Tom', age=2}
上述代码中,定义了一个局部内部类,在新创建的一个TreeSet中加入了比较器对象,比较器通过年龄来比较大小。
处理使用 Comparator 接口,还可以通过类实现 Comparable 接口实现比较策略。代码如下:
@Test
public void test5(){
class Cat implements Comparable<Cat>{
private String name;
private int age;
public Cat(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Cat{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Cat o) {
if (this.age > o.age){
return 1;
}
return -1;
}
}
TreeSet<Cat> treeSet = new TreeSet<>();
treeSet.add(new Cat("Tom",3));
treeSet.add(new Cat("Tony",2));
for (Cat cat : treeSet) {
System.out.println(cat);
}
}
// 结果
Cat{name='Tony', age=2}
Cat{name='Tom', age=3}