TreeSet的特点
TreeSet为Collection集合框架体系下的Set接口下的SortedSet接口的一种实现。
其实现元素不重复的方法是红黑树。
其存储元素必须实现Compable接口
TreeSet的使用
package com.design;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet<People> sets = new TreeSet<>();
sets.add(new People("张三",18));
sets.add(new People("李四",23));
sets.add(new People("王五",3));
sets.add(new People("赵二",33));
sets.add(new People("曹八",76));
System.out.println(sets);
}
}
class People{
private String name;
private int age;
public People(String name, int age) {
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;
}
}
我们像使用HashSet一样使用TreeSet来为集合中添加元素,却抛出了异常
出现此异常的原因是我们没有实现Comparable接口,导致程序无法对元素排序构造红黑树。
Comparable接口默认是一个泛型接口,我们需要实现里面的compareTo方法
返回一个整形值。
如果用this指向的当前对象与参数所代表的对象的差>0
则将this指向的对象排在后面
package com.design;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet<People> sets = new TreeSet<>();
sets.add(new People("张三",18));
sets.add(new People("尼古拉西",18));
sets.add(new People("李四",23));
sets.add(new People("王五",3));
sets.add(new People("赵二",33));
sets.add(new People("曹八",76));
System.out.println(sets);
}
}
class People implements Comparable<People>{
@Override
public String toString() {
return this.name+"年龄:"+this.age;
}
@Override
public int compareTo(People o) {
int n1 = this.age - o.age;
int n2 = this.name.compareTo(o.name);
return n1==0?n2:n1;
}
private String name;
private int age;
public People(String name, int age) {
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;
}
}
以上便是TreeSet的实例
当然 我们还可以在TreeSet的构造函数中直接传入一个lamda表达式来表述排序方式
TreeSet<People> sets = new TreeSet<People>((people1,people2)->{
return people1.getAge()-people2.getAge();
});