Java TreeSet类的用法(非常详细)
TreeSet 是 Java Set 接口中的另一个实现类,内部采用二叉搜索树的数据结构存储元素。二叉搜索树的数据结构保证了 TreeSet 集合中没有重复的元素。
不同于 HashSet 集合的无序,TreeSet 集合可以对元素进行排序。因此,自定义的类需要实现 Comparable 接口,这样才能根据 compareTo() 方法比较对象之间的大小,才能进行内部排序。
使用 TreeSet 集合需要注意以下两点:
定义 TreeSet 类的语法格式如下:
【实例】TreeSet 集合的常用方法的应用。
TreeSet 集合默认使用 Comparable 接口的实现类重写的 compareTo() 方法的逻辑进行排序,但在有些场景下,可能需要按照其他的逻辑进行排序。
例如,在某个案例中,希望存储在 TreeSet 集合中的字符串可以按照长度而不是英文字母的顺序进行排序,这时可以通过在创建 TreeSet 集合时自定义一个比较器(Comparator 接口的实现类)来提供定制化的排序逻辑。下面实现 TreeSet 集合中字符串按照长度进行定制排序。
【实例】TreeSet 集合定制排序方式的应用。
不同于 HashSet 集合的无序,TreeSet 集合可以对元素进行排序。因此,自定义的类需要实现 Comparable 接口,这样才能根据 compareTo() 方法比较对象之间的大小,才能进行内部排序。
使用 TreeSet 集合需要注意以下两点:
- 由于是二叉搜索树,因此需要对元素做内部排序。如果要放入 TreeSet 集合中的类没有实现 Comparable 接口,就会抛出 java.lang.ClassCastException 异常。
- TreeSet 集合中不能放入 null 元素。
定义 TreeSet 类的语法格式如下:
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, SerializableTreeSet 集合的特有方法如表 1 所示。
| 方法声明 | 功能描述 |
|---|---|
| TreeSet() | 构造方法,构造一个新的、空的 TreeSet,根据其元素的自然顺序进行排序 |
| TreeSet(Collectionc) | 构造方法,构造一个包含指定集合中的元素的 TreeSet,根据其元素的自然排序进行排序 |
| TreeSet(Comparatorcomparator) | 构造方法,构造一个新的、空的 TreeSet,根据指定的比较器进行排序 |
|
TreeSet(SortedSet |
构造方法,构造一个与指定有序 Set 具有相同映射关系和相同排序的新的 TreeSet |
| E first() | 返回此集合中当前的第一个(最低)元素 |
| E last() | 返回此集合中当前的最后一个(最高)元素 |
| E lower(E e) | 返回此集合中小于给定元素的最大元素。若没有,则返回 null |
| E floor(E e) | 返回此集合中小于或等于给定元素的最大元素。若没有,则返回 null |
| E higher(E e) | 返回此集合中大于给定元素的最小元素。若没有,则返回 null |
| E ceiling(E e) | 返回此集合中大于或等于给定元素的最小元素。若没有,则返回 null |
| E pollFirst() | 检索并删除第一个(最低)元素。若该集合为空,则返回 null |
| E pollLast() | 检索并删除最后一个(最高)元素。若该集合为空,则返回 null |
|
Iterator |
以升序返回该集合中的元素的迭代器 |
|
Iterator |
以降序返回该集合中的元素的迭代器 |
【实例】TreeSet 集合的常用方法的应用。
import java.util.TreeSet;
class Stu implements Comparable<Stu> {
int id;
String name;
int age;
public Stu(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
/**
* compareTo()方法按照id的大小自然排序,若返回0则表示相等
* 若返回正数则表示大于,若返回负数则表示小于
*/
public int compareTo(Stu o) {
if (this.id > o.id) {
return 1;
} else if (this.id < o.id) {
return -1;
} else {
return 0;
}
}
}
public class Demo {
public static void main(String[] args) {
Stu student1 = new Stu(3, "张三", 18);
Stu student2 = new Stu(2, "李四", 19);
Stu student3 = new Stu(1, "王五", 20);
TreeSet<Stu> myset1 = new TreeSet<Stu>();
// 添加元素
myset1.add(student1);
myset1.add(student2);
myset1.add(student3);
// 遍历集合,按学号升序排序
for (Stu e : myset1) {
System.out.println("学号: " + e.id + " 姓名: " + e.name + " 年龄: " + e.age);
}
System.out.println("----------------");
TreeSet myset2 = new TreeSet<>();
myset2.add(5);
myset2.add(9);
myset2.add(1);
myset2.add(3);
myset2.add(15);
// 自动排序
System.out.println("第二个 TreeSet 集合为: " + myset2);
// 获取第一个元素和最后一个元素
System.out.println("第二个 TreeSet 集合的第一个元素: " + myset2.first());
System.out.println("第二个 TreeSet 集合的最后一个元素: " + myset2.last());
System.out.println("----------------");
// 比较并获取元素
System.out.println("集合中小于或等于 6 的最大的一个元素为: " + myset2.floor(6));
System.out.println("----------------");
// 删除元素
Object first = myset2.pollFirst();
System.out.println(first);
System.out.println("----------------");
System.out.println("删除第一个元素后集合为: " + myset2);
}
}
运行结果为:
学号: 1 姓名: 王五 年龄: 20
学号: 2 姓名: 李四 年龄: 19
学号: 3 姓名: 张三 年龄: 18
-----------------
第二个 TreeSet 集合为: [1, 3, 5, 9, 15]
第二个 TreeSet 集合的第一个元素: 1
第二个 TreeSet 集合的最后一个元素: 15
-----------------
集合中小于或等于 6 的最大的一个元素为: 5
-----------------
1
-----------------
删除第一个元素后集合为: [3, 5, 9, 15]
TreeSet 集合默认使用 Comparable 接口的实现类重写的 compareTo() 方法的逻辑进行排序,但在有些场景下,可能需要按照其他的逻辑进行排序。
例如,在某个案例中,希望存储在 TreeSet 集合中的字符串可以按照长度而不是英文字母的顺序进行排序,这时可以通过在创建 TreeSet 集合时自定义一个比较器(Comparator 接口的实现类)来提供定制化的排序逻辑。下面实现 TreeSet 集合中字符串按照长度进行定制排序。
【实例】TreeSet 集合定制排序方式的应用。
import java.util.Comparator;
import java.util.TreeSet;
class MyComparator implements Comparator {
// 定制排序方式
public int compare(Object obj1, Object obj2) {
String str1 = (String) obj1;
String str2 = (String) obj2;
int t = str1.length() - str2.length();
return t;
}
}
public class Demo{
public static void main(String[] args) {
// 创建集合,传入 Comparator 接口实现定制排序规则
TreeSet treeSet1 = new TreeSet(new MyComparator());
treeSet1.add("Java");
treeSet1.add("I");
treeSet1.add("love!");
treeSet1.add("very");
System.out.println(treeSet1);
}
}
运行结果如下:
[I, Java, love!]
由运行结果可知,当向集合中添加元素时,TreeSet 集合按照定制的排序规则进行比较,并且删除重复的字符串(长度相同就是重复)。
ICP备案:
公安联网备案: