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 集合按照定制的排序规则进行比较,并且删除重复的字符串(长度相同就是重复)。