抱歉,你查看的文章不存在

唠唠SE的集合-08——TreeSet 原

8. TreeSet

使用元素的自然顺序对元素进行排序,或者根据创建set时提供的Comparator进行排序。

底层数据结构是红黑树(红黑树是一种自平衡的二叉树,特点是左大右小)

有关红黑树的知识,戳:红黑树, 或者:最容易懂的红黑树

我们在HashSet里写过一个Person,那我们直接拿来存到TreeSet里吧:

import java.util.TreeSet;

public class Test {
    public static void main(String[] args) {
        TreeSet<Person> set = new TreeSet<>();
        set.add(new Person(1, "辣条"));
        set.add(new Person(3, "冰棍"));
        set.add(new Person(4, "面包"));
        set.add(new Person(2, "薯片"));
        set.add(new Person(2, "薯片"));
        set.add(new Person(2, "薯片"));
        for (Person person : set) {
            System.out.println(person);
        }
    }
}

class Person {
    public int id;
    public String name;
    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + "]";
    }
}

运行之后报了一个错。。。

注意!!!

TreeSet存储的类型必须实现Comparable接口并重写compareTo方法,否则会抛出ClassCastException

那我们让Person类实现Comparable接口,再存储到TreeSet中:

(注意,这里只能返回-1,0,1  三个值)

import java.util.TreeSet;

public class Test {
    public static void main(String[] args) {
        TreeSet<Person> set = new TreeSet<>();
        set.add(new Person(1, "辣条"));
        set.add(new Person(3, "冰棍"));
        set.add(new Person(4, "面包"));
        set.add(new Person(2, "薯片"));
        set.add(new Person(2, "薯片"));
        set.add(new Person(2, "薯片"));
        for (Person person : set) {
            System.out.println(person);
        }
    }
}

class Person implements Comparable<Person> {
    public int id;
    public String name;
    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + "]";
    }
    @Override
    public int compareTo(Person o) {
        if (o.id - this.id > 0) { //设计的是降序排列,大的往左靠
            return 1;
        }else if (o.id - this.id == 0) {
            return 0;
        }else {
            return -1;
        }
    }
}

运行结果:

除了让存入的类型实现Comparable接口外,还可以在初始化TreeSet时传入一个比较器

这里用到了之前在内部类里提到的一个比较常用的东西:匿名内部类!!

import java.util.Comparator;
import java.util.TreeSet;

public class Test {
    public static void main(String[] args) {
        TreeSet<Person> set = new TreeSet<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                if (o1.id - o2.id > 0) { // 设计的升序排列,大的往右靠
                    return 1;
                }else if (o1.id - o2.id == 0) {
                    return 0;
                }else {
                    return -1;
                }
            }
        });
        set.add(new Person(1, "辣条"));
        set.add(new Person(3, "冰棍"));
        set.add(new Person(4, "面包"));
        set.add(new Person(2, "薯片"));
        set.add(new Person(2, "薯片"));
        set.add(new Person(2, "薯片"));
        for (Person person : set) {
            System.out.println(person);
        }
    }
}

class Person {
    public int id;
    public String name;
    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + "]";
    }
}

运行结果:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

编辑于

LinkedBear的个人空间

0 篇文章14 人订阅

相关文章

来自专栏一英里广度一英寸深度的学习

二叉树的插入和搜索--python实现

在二分查找基于数组,在插入删除时需要移动较多节点,采用二叉树的数据结构,更好的实现插入、删除操作。

42810
来自专栏学习力

《Java从入门到放弃》JavaSE入门篇:集合

15570
来自专栏java一日一条

面试中的 10 大排序算法总结

查找和排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只...

21430
来自专栏小灰灰

JDK容器学习之HashMap (三) : 迭代器实现

HashMap 迭代器实现方式 java的容器类,实现Collection接口的都会实现迭代器方式,Map则有点特殊,它不实现Collection接口,它的迭...

22550
来自专栏趣谈编程

堆排序

面试官:写一个堆排吧 我心想:幸好昨天刚看 ? 堆排是基于堆的一种排序算法,对于堆的了解,请看可以管理时间的二叉堆(如果对堆的插入和删除不清楚,强烈建议先看堆...

23890
来自专栏算法channel

程序员必看:实现栈有这两种策略,有完整分析和代码实现

这两篇中分别总结了程序的时间性能度量指标,典型的时间复杂度类型,Java中类型的空间消耗的量化情况。后一篇考虑计算机中最重要的基础算法查找和排序算法,这篇可以说...

11100
来自专栏java闲聊

设计模式之 原型模式

在Java中实现原型模式十分简单,只需要实现Cloneable接口并重写clone()方法就可以了

6830
来自专栏java系列博客

java Arrays.aslist用法

18960
来自专栏轮子工厂

八大排序算法稳定性分析,原来稳定性是这个意思...

2、在一趟选择中,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了;

25760
来自专栏智能大石头

分析midea0978的《一个C#算法分析求解》(二)

一、准备工作 首先处理以下Calc函数,以方便查看。其实就是变量重命名工作,此时多亏了VS2005的帮忙。 输入字符串str,输入是字节数组引用; i...

19450

扫码关注云+社区

领取腾讯云代金券