怀旧网,博客详情:Java TreeSet 介绍

1、java枚举类详解

2、java String 类和类方法详解

3、StringBuffer 详解

4、Java Math 类详解

5、java random详解

6、java Date类使用讲解

7、java 集合类详解

8、java算法二分查找

9、SpringBoot 在初始化加载无法使用@Value的时候读取配置文件教程

10、springboot 项目配置本地jar包导入

11、单个java文件运行需要带上jar包的用法

12、spring boot 项目配置https服务

13、Java异常详解

14、Java Collection的使用

15、Java List 集合

16、Java ArrayList 介绍

17、Java LinkedList 讲解

18、Java Set 集合介绍

19、Java HashSet 介绍

20、Java TreeSet 介绍

21、Java Map 介绍以及子类介绍

22、Java 多线程使用介绍

23、Java 注解讲解

24、Java 反射讲解

25、Java 反射讲解

26、HashMap 源码讲解

27、面向对象初级教学

28、Java整合JWT使用

原创

Java TreeSet 介绍

TreeSet 与 其他 Set 集合的区别

  1. TreeSet 存储的数据默认输出是有序的
  2. TreeSet 底层采用的存储数据结构不是数组+链表+红黑树,而是直接采用的红黑树
  3. TreeSet 的去重方式是根据当前的插入的元素和原数据进行比较看是否去重的(比较的规则可以自定义的)

使用测试

创建一 TreeSet 实例

TreeSet<Integer> ts = new TreeSet<>();

像里面添加无序的数据

TreeSet<Integer> ts = new TreeSet<>();

ts.add(2);
ts.add(3);
ts.add(1);

System.out.println(ts);

image-20240318093351494

输出结果默认有序


其他类型测试

TreeSet<String> ts = new TreeSet<>();

ts.add("abb");
ts.add("aab");
ts.add("ab");

System.out.println(ts);

image-20240318093501101

这里的比较规则,是根据底层的字符串自己的比较规则来进行排序的,首先比较第一位,谁小谁在前,后面一次比较其他位置数据,比较的值是根据对应字符在Ascall码表的值来比较的。


自定义数据类型测试

public class Student {
    public String name;
    public int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
public static void main(String[] args) {
    TreeSet<Student> ts = new TreeSet<>();

    ts.add(new Student("zhangsan", 5));
    ts.add(new Student("wangwu", 2));
    ts.add(new Student("lisi", 4));

    System.out.println(ts);
}

image-20240318094103946

注意:运行报错

​ 原因: 因为TreeSet底层是采用黑红树的数据结构来进行存储数据,但是这种数据进行存储的时候,必须要是可以进行比较的数据才可以,这边的自定义数据类型,并不能进行谁大谁小的比较,所以会报错。


添加比较规则测试

直接继承Comparable结构,重写compareTo方法来实现比较规则--这边是采用比较年龄大小来进行区分

public class Student implements Comparable<Student>{
    public String name;
    public int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Student s) {
        return this.age - s.age;
    }
}

再次运行代码

image-20240318094437628

成功输出结果,并且得到升序的数据

TreeSet<Student> ts = new TreeSet<>();

ts.add(new Student("zhangsan", 5));
ts.add(new Student("wangwu", 2));
ts.add(new Student("lisi", 4));

ts.add(new Student("zhaoliu", 4));

System.out.println(ts);

image-20240318095855514

可以从输出结果看出来尽管用户名不用,但是age相同也会触发相同数据不添加。原因是重写的compareTo方法里面是通过age来比较大小的。


第二种实现排序的方法

在对字符串进行比较的时候,它默认是根据自己的规则来进行排序的,但是我目前不相通过它自己的规则,但是有不能改它的源码,所以现在就可以采用第二种规则来进行。(这边的规则设定为,根据字符串的长度来判断,要是长度一样就说明重复)

默认情况:

TreeSet<String> ts = new TreeSet<>();

ts.add("abcd");
ts.add("ab");
ts.add("add");

ts.add("ab");

System.out.println(ts);

image-20240318103015620

没有安装需要的方式来进行-现在使用新方式,自定义排序规则

TreeSet<String> ts = new TreeSet<>(new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        int i1 = s1.length();
        int i2 = s2.length();

        return i1 - i2;
    }
});

ts.add("abcd");
ts.add("ab");
ts.add("add");

ts.add("ab");

System.out.println(ts);

image-20240318103228687

结果完成预期效果

简写代码:

TreeSet<String> ts = new TreeSet<>((s1, s2) -> s1.length() - s2.length());

ts.add("abcd");
ts.add("ab");
ts.add("add");

ts.add("ab");

System.out.println(ts);

image-20240318103350308

完成最终效果

总结

image-20240318103457398

  • 平台作者:怀旧(联系作者)
  • QQ:444915368
  • 邮箱:444915368@qq.com
  • 电话:17623747368
  • 评论

    登录后才可以进行评论哦!

    回到顶部 留言