集合详解之TreeSet集合--排序及API应用

本文详细介绍了Java中TreeSet集合的工作原理,包括其基于红黑树的排序机制和两种排序方式:自然排序和定制排序。通过示例展示了自然排序时实现Comparable接口的重要性,以及如何通过Comparator接口进行定制排序。此外,还讲解了TreeSet的相关API,如lower、higher、subSet、headSet和tailSet方法的使用,以及它们在不同场景下的应用。
摘要由CSDN通过智能技术生成
一.TreeSet集合的介绍
TreeSet集合可以确保集合元素处于排序状态
TreeSet集合并不是根据元素的插入顺序进行排序的,而是根据元素实际指的大小进行排序的
与HashSet集合根据HashCode的值来决定元素的存储位置不同的是TreeSet集合是根据红黑树
的数据结构来存储集合元素的.


二.红黑树介绍
红黑树是一种自平衡排序二叉树,树中每个节点的值,都大于或等于在它的左子树中的所有
节点的值,并且小于或等于在它的右子树中的所有节点的值,这确保红黑树运行时可以快速
地在树中查找和定位的所需节点。


排序二叉树是一种特殊结构的二叉树,可以非常方便地对树中所有节点进行排序和检索。
排序二叉树要么是一棵空二叉树,要么是具有下列性质的二叉树:
若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
它的左、右子树也分别为排序二叉树。

三.TreeSet集合支持两种排序方法:自然排序和定制排序.
3.1自然排序
TreeSet集合会调用集合元素的comPareTo(Object object)方法来比较元素之间的大小关系,
然后将元素按升序排列,这种方式就是自然排序.
当把一个对象添加到TreeSet集合时,TreeSet集合调用该对象的comPareTo(Object object)方
法与容器中的其他对象进行比较,然后根据红黑树结构找到他的存储位置.如果两个对象通过
comPareTo(Object object)方法比较相等,新对象将无法添加到TreeSet(Set集合元素不能重复)
集合中.


java提供了一个Comparable接口,该接口里提供了一个comPareTo(Object object)的方法,该方
法返回一个整数,实现该接口的类必须实现该方法,实现了该接口的类的对象就可以比较大小.
当一个对象调用该方法与另外一个对象进行比较时,如object1.compareTo(object2),如果该方
法返回0,则这两个对象相等,如果该方法返回一个正整数则表明object1大于object2,如果该方
法返回一个负整数则表明object1小于object2.


错误示例1
package javaDemo;


import java.util.TreeSet;


public class TreeSetDemo2 {
public static void main(String[] args) {
dealData();
}


public static void dealData() {
TreeSet<Student> dataList = new TreeSet<>();
dataList.add(new Student());
}
}
class Student{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
运行结果:
Exception in thread "main" java.lang.ClassCastException: javaDemo.Student cannot be cast to java.lang.Comparable
at java.util.TreeMap.compare(Unknown Source)
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at javaDemo.TreeSetDemo2.dealData(TreeSetDemo2.java:12)
at javaDemo.TreeSetDemo2.main(TreeSetDemo2.java:7)
报异常是因为Student类没有实现Comparable接口.


错误示例2
package javaDemo;


import java.util.TreeSet;


public class TreeSetDemo2 {
public static void main(String[] args) {
dealData();
}


public static void dealData() {
TreeSet<Object> dataList = new TreeSet<>();
// dataList.add(new Student());
dataList.add("1");
dataList.add(1);
}
}
运行结果:
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
at java.lang.Integer.compareTo(Unknown Source)
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at javaDemo.TreeSetDemo2.dealData(TreeSetDemo2.java:14)
at javaDemo.TreeSetDemo2.main(TreeSetDemo2.java:7)
分析:
大部分类在实现compareTo(Object object)方法时都需要将被比较的对象object强转成相同的类型,
因为只有相同的类的两个实例才会比较大小.当试图把一个对象添加到TreeSet集合中时,TreeSet集合
就会调用该对象compareTo(Object object)方法与集合中的其他元素进行比较,这就要求集合中的其
他元素与该元素是同一个类的实例.
也就是说向TreeSet集合中添加的是同一个类的对象,否则就引发异常.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值