TreeSet子类可以针对设置的数据进行排序保存,TreeSet子类的定义结构如下:
public class TreeSet<E>
extends AbstracSet<E>
implements NavigableSet<E>, Cloneable, Serializable{}
NavigableSet接口为排序标准接口,是Set的子接口。
1、使用TreeSet保存数据的例子:
package com.mydemo;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
// 实例化集合接口
Set<String> all = new TreeSet<>();
// 保存数据
all.add("h火影");
all.add("h火影"); // 保存重复的数据
all.add("s水影");
all.add("f风影");
all.add("t土影");
all.add("l雷影");
/**
* 输出数据
*
* 所有保存的数据会按照由小到大的顺序(字符串会按照字母大小顺序依次比较)排列
*/
System.out.println(all);
}
}
运行结果:
[f风影, h火影, l雷影, s水影, t土影]
2、使用TreeSet保存自定义类对象的例子【TreeSet类在进行有序数据存储时依据的是Comparable接口实现排序,并且也是依据Comparable接口中的compareTo()方法来判断重复元素,所以在使用TreeSet进行自定义类对象保存时必须实现Comparable接口。但是在覆盖compareTo()方法时需要进行类中全部属性的比较,否则会出现部分属性相同时被误判为同一对象,导致重复元素判断失败】:
package com.mydemo;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
// 实例化集合接口
Set<Member> all = new TreeSet<>();
// 增加数据
all.add(new Member("赵六", 21));
all.add(new Member("李四2", 19));
all.add(new Member("张三", 18));
all.add(new Member("李四", 19));
all.add(new Member("王五", 20));
all.forEach(System.out::println);
}
}
// 比较器
class Member implements Comparable<Member> {
private String name;
private int age;
/**
* 双参构造方法,属性赋值
*
* @param name
* @param age
*/
public Member(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Member{" +
"姓名:'" + name + '\'' +
", 年龄:" + age +
'}';
}
@Override
public int compareTo(Member o) {
if (this.age < o.age) {
return -1;
} else if (this.age > o.age) {
return 1;
} else {
// 年龄相同时,进行姓氏比较
return this.name.compareTo(o.name);
}
}
}
运行结果:
Member{姓名:'张三', 年龄:18}
Member{姓名:'李四', 年龄:19}
Member{姓名:'李四2', 年龄:19}
Member{姓名:'王五', 年龄:20}
Member{姓名:'赵六', 年龄:21}