首页 > 编程笔记 > Java笔记 阅读:6

Java TreeSet类的用法(非常详细)

TreeSet 是 Java Set 接口中的另一个实现类,内部采用二叉搜索树的数据结构存储元素。二叉搜索树的数据结构保证了 TreeSet 集合中没有重复的元素。

不同于 HashSet 集合的无序,TreeSet 集合可以对元素进行排序。因此,自定义的类需要实现 Comparable 接口,这样才能根据 compareTo() 方法比较对象之间的大小,才能进行内部排序。

使用 TreeSet 集合需要注意以下两点:
定义 TreeSet 类的语法格式如下:
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, Serializable
TreeSet 集合的特有方法如表 1 所示。

表 1 TreeSet集合的特有方法
方法声明 功能描述
TreeSet() 构造方法,构造一个新的、空的 TreeSet,根据其元素的自然顺序进行排序
TreeSet(Collectionc) 构造方法,构造一个包含指定集合中的元素的 TreeSet,根据其元素的自然排序进行排序
TreeSet(Comparatorcomparator) 构造方法,构造一个新的、空的 TreeSet,根据指定的比较器进行排序
TreeSet(SortedSet s) 构造方法,构造一个与指定有序 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() 以升序返回该集合中的元素的迭代器
Iterator descendingIterator() 以降序返回该集合中的元素的迭代器

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

相关文章