javaSE复习之——TreeSet类

TreeSet的概述

它是一个二叉树集合小的(负数)放在左边大的(正数)放在右边,并且对集合元素进行排序,并且可以保证元素的唯一性,也就是去除重复,它的主要功能是排序。它依赖map集合

TreeSet特点:

  • TreeSet集合存储元素取决于compareTo方法返回值

    返回0:
    表示作比较的两个对象是相等的,这时集合不存这个元素。

    返回负数:
    表示要存入的元素小于上一个作比较元素,然后把这个元素放在作比较元素的左边,如果它的左边还有元素就再进行比较

    返回正数:
    表示大于上一个元素,这时把这个元素放在上一个元素的右边,如果右边还有元素,就再进行比较。

TreeSet存元素的原理

首先存入第一个元素(根元素),然后再存入第二个元素时调用compareTo方法取到返回值,然后根据返回值存元素;

如果之前已经存了n个元素,那么调用compareTo逐次与每个元素作比较,

TreeSet取元素原理

从最小的开始取,也就是从左向右取,先取根元素左边的元素,如果根元素左边的元素下面还有元素就先从那里开始取,这里也是从左到右的原理,取根元素右边元素也是同理,从左边向右边取元素,如果左边或右边元素下面还有元素,那么也是遵循从左到右的原则。

注意:左边元素全部取完后再慢慢向右边取

为什么存入自定义对象的时候会报错?

  • 原因:

    因为TreeSet会对集合元素进行排序,而它不知道自定义对象按照什么方法来排序,所以会报错。

  • 解决方法:

    让自定义对象这个类去实现Comparable接口,然后重写compareTo方法,此方法返回0则集合只能存一个对象,返回1按照存的顺序排序,返回-1按照存的顺序的倒叙存。

重写compareTo例子

1
2
3
4
public int compareTo(Student o) {
int num = o.sum - this.sum;
return num == 0 ? 1 : num;
}

ps:比较字符串可以调用字符串的conpareTo方法比较

TreeSet比较器Comparator的概述

可以自定义对TreeSet集合进行排序

使用方法

首先创建一个类并且让这个类实现Comparator接口,然后重写compare方法,最后在创建TreeSet集合对象的时候创建这个类的对象传入即可。

特点

compare方法中第一个参数是调用的对象,第二个参数是被比较集合中的对象

两种排序方式的区别

1、构造TreeSet集合什么都不传,就默认使用类中的Comparable的顺序,也就是compareTo方法。(传入集合的自定义对象实现了Comparable接口则用自定义类)

2、构造TreeSet集合传入Comparator比较器,那么优先按照比较器顺序排序。