8. TreeSet
使用元素的自然顺序对元素进行排序,或者根据创建set时提供的Comparator进行排序。
底层数据结构是红黑树(红黑树是一种自平衡的二叉树,特点是左大右小)
我们在HashSet里写过一个Person,那我们直接拿来存到TreeSet里吧:
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
TreeSet<Person> set = new TreeSet<>();
set.add(new Person(1, "辣条"));
set.add(new Person(3, "冰棍"));
set.add(new Person(4, "面包"));
set.add(new Person(2, "薯片"));
set.add(new Person(2, "薯片"));
set.add(new Person(2, "薯片"));
for (Person person : set) {
System.out.println(person);
}
}
}
class Person {
public int id;
public String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
}
运行之后报了一个错。。。
注意!!!
TreeSet存储的类型必须实现Comparable接口并重写compareTo方法,否则会抛出ClassCastException
那我们让Person类实现Comparable接口,再存储到TreeSet中:
(注意,这里只能返回-1,0,1 三个值)
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
TreeSet<Person> set = new TreeSet<>();
set.add(new Person(1, "辣条"));
set.add(new Person(3, "冰棍"));
set.add(new Person(4, "面包"));
set.add(new Person(2, "薯片"));
set.add(new Person(2, "薯片"));
set.add(new Person(2, "薯片"));
for (Person person : set) {
System.out.println(person);
}
}
}
class Person implements Comparable<Person> {
public int id;
public String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
@Override
public int compareTo(Person o) {
if (o.id - this.id > 0) { //设计的是降序排列,大的往左靠
return 1;
}else if (o.id - this.id == 0) {
return 0;
}else {
return -1;
}
}
}
运行结果:
除了让存入的类型实现Comparable接口外,还可以在初始化TreeSet时传入一个比较器
这里用到了之前在内部类里提到的一个比较常用的东西:匿名内部类!!
import java.util.Comparator;
import java.util.TreeSet;
public class Test {
public static void main(String[] args) {
TreeSet<Person> set = new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
if (o1.id - o2.id > 0) { // 设计的升序排列,大的往右靠
return 1;
}else if (o1.id - o2.id == 0) {
return 0;
}else {
return -1;
}
}
});
set.add(new Person(1, "辣条"));
set.add(new Person(3, "冰棍"));
set.add(new Person(4, "面包"));
set.add(new Person(2, "薯片"));
set.add(new Person(2, "薯片"));
set.add(new Person(2, "薯片"));
for (Person person : set) {
System.out.println(person);
}
}
}
class Person {
public int id;
public String name;
public Person(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + "]";
}
}
运行结果:
来源:oschina
链接:https://my.oschina.net/u/3041734/blog/1616004