Java集合类之Set的TreeSet之整理电话簿

相关知识

什么是 TreeSet 集合

TreeSet 集合是 Set 集合的实现类,因此它也具有元素唯一性和无序性,它的底层数据结构是 TreeMap 树结构,它确保元素的唯一性是通过 Compareable 接口的 compareto 方法,另外,它既是无序的,又是有序的。无序指的是存储元素顺序和输出顺序不同,有序指的是遍历集合时,输出的所有元素是有序的。

创建 TreeSet 集合

使用以下代码即可创建 TreeSet 集合。

public static void main(String[] args) {
    
    
        // 创建存储字符串的TreeSet集合
        Set<String> set = new TreeSet<>();
    }

TreeSet 集合的无序性

在以下代码中,往集合中存储元素的顺序为:123-aa-a,输出顺序却是123-a-aa,这就是 TreeSet 集合的无序性,即存储元素顺序和提取顺序不同。

public static void main(String[] args) {
    
    
        // 创建存储字符串的TreeSet集合
        Set<String> set = new TreeSet<>();
        // 添加元素
        set.add("123");
        set.add("aa");
        set.add("a");
        // 打印集合
        System.out.print(set);
    }

执行结果:

[123,a,aa]

TreeSet 集合的有序性

添加元素到 TreeSet 集合时,TreeSet 集合会调用元素的 compareTo() 方法来比较元素之间的大小关系,并将集合元素按升序排列,这就是它的有序性,下表展示了 TreeSet 集合对各种数据类型的默认排序规则:

元素类型 排序方式
数值类型 按数值大小
Character类型 按字符的 unicode 值来进行比较
Boolean类型 true 大于 false
String类型 按字符串中字符的 unicode 值进行比较
Date、Time类型 后边的时间、日期比前面的时间、日期大
以下代码中,往集合中分别添加元素 true 和 false,根据默认排序规则,输出结果为:[false,true]。

public static void main(String[] args) {
    
    
        // 创建存储Boolean类型的TreeSet集合
        Set<Boolean> set = new TreeSet<>();
        // 判断集合是否为空
        boolean empty = set.isEmpty();
        System.out.println(empty);
        // 添加元素
        set.add(empty);     
        set.add(false);
        // 打印集合
        System.out.print(set);
    }

执行结果:

true
[false, true]

TreeSet 集合自定义排序

如果需要实现自定义排序,例如降序,则可以使用 Comparator 接口,该接口里包含一个 compare(T o1, T o2)方法,该方法用于比较 o1 和 o2 的大小。在创建 TreeSet 集合对象时,提供一个 Comparator 对象与该 TreeSet 集合关联,该 Comparator 对象负责集合元素的排序逻辑。

自定义降序输出示例:

import java.util.*;
// 自定义类实现Comparator
class DescSort implements Comparator<Integer> {
    
    
    // 重写compare方法
    public int compare(Integer s1, Integer s2) {
    
    
        // 如果第一个数大于第二个数,返回负数,默认为正数
        if (s1.compareTo(s2) > 0)
            return -1;
        // 如果第一个数小于第二个数,返回正数,默认为负数
        else if (s1.compareTo(s2) < 0)
            return 1;
        // 如果第一个数等于第二个数,返回0
        else
            return 0;
    }
}
public class tt {
    
    
    public static void main(String[] args) {
    
    
        // 创建存储整数的TreeSet集合
        Set<Integer> set = new TreeSet<>();
        // 创建Comparator对象
        Comparator<Integer> comp = new DescSort();
        // 把Comparator对象与TreeSet对象关联
        set = new TreeSet<Integer>(comp);
        // 添加元素
        for (int i = 9; i < 14; i++)
            set.add(i);
        // 打印集合
        System.out.print(set);
    }
}

执行结果:

[13, 12, 11, 10, 9]

Guess you like

Origin blog.csdn.net/qq_52297656/article/details/121270698