12、TreeSet实现类

12、TreeSet实现类

TreeSet实现类是set的另一个实现类,前面我们讲了一个HashSet。那现在让我们来看看什么是TreeSet

(1)基本概念

  • 基于排序顺序实现不重复
  • 实现SortedSet接口,对集合元素自动排序
  • 元素对象的类型必须实现Comparable接口,指定排序规则
  • 通过CompareTo方法确定是否为重复元素

(2)TreeSet的简单使用

package ch09_set;

import java.util.Iterator;
import java.util.TreeSet;

/**
 * TreeSet的使用
 * 存储结构:红黑树
 * @author 18902
 * @date 2021/3/16 21:07
 */
public class Demo2 {
    public static void main(String[] args) {

        //创建集合

        TreeSet<String> treeSet=new TreeSet<> ();
        //添加元素
        treeSet.add ("abc");
        treeSet.add ("xyz");
        treeSet.add ("hello");

        System.out.println ("元素个数:"+treeSet.size ());
        System.out.println (treeSet.toString ());

        //删除元素
    //        treeSet.remove ("abc");
    //        System.out.println ("删除之后:"+treeSet.size ());

        //遍历()使用增强for
        for(String string:treeSet){
            System.out.println (string);
        }

        //使用迭代器

        Iterator iterator=treeSet.iterator ();
        while (iterator.hasNext ()){
            System.out.println (iterator.next ());
        }

        //判断

        System.out.println (treeSet.contains ("abc"));
    }
}


(3)TreeSet保存数据的使用(Person类实现Comparable)

package ch09_set;

import java.util.TreeSet;

/**
 * 使用TreeSet保存数据
 * 存储结构:红黑树
 * @author 18902
 * @date 2021/3/16 21:44
 */
public class Demo3 {
    public static void main(String[] args) {
        //创建集合

        TreeSet<Person> treeSet=new TreeSet<> ();
        //添加元素
        Person p1=new Person ("l",10);
        Person p2=new Person ("y",30);
        Person p3=new Person ("m",20);

        treeSet.add (p1);
        treeSet.add (p2);
        treeSet.add (p3);

        System.out.println ("元素个数:"+treeSet.size ());
    }
}

当我们运行时会发现报下面的错误:

Exception in thread "main" java.lang.ClassCastException: ch09_set.Person cannot be cast to java.lang.Comparable
	at java.util.TreeMap.compare(TreeMap.java:1294)
	at java.util.TreeMap.put(TreeMap.java:538)
	at java.util.TreeSet.add(TreeSet.java:255)
	at ch09_set.Demo3.main(Demo3.java:21)

这个是指类型转换异常来着。由于TreeSet的存储结构时红黑树(二叉查找树,左边节点都比右边节点要小【与根节点比较】 ),那么元素就必须要实现Comparable接口

  • Person实现Comparable接口
    //先按照姓名进行比较,再按照年龄进行比较
    @Override
    public int compareTo(Person o) {
        int n1=this.getName ().compareTo (o.getName ());
        int n2=this.getAge ()-o.getAge ();
        return n1==0?n2:n1;
    }

这个时候我们再来运行会发现不报错了:
在这里插入图片描述

  • 测试类
package ch09_set;

import java.util.Iterator;
import java.util.TreeSet;

/**
 * 使用TreeSet保存数据
 * 存储结构:红黑树
 * @author 18902
 * @date 2021/3/16 21:44
 */
public class Demo3 {
    public static void main(String[] args) {
        //创建集合

        TreeSet<Person> treeSet=new TreeSet<> ();
        //添加元素
        Person p1=new Person ("l",10);
        Person p2=new Person ("y",30);
        Person p3=new Person ("m",20);

        treeSet.add (p1);
        treeSet.add (p2);
        treeSet.add (p3);

        System.out.println ("元素个数:"+treeSet.size ());
        System.out.println (treeSet.toString ());

        //删除

        treeSet.remove (p1);
        System.out.println (treeSet.size ());

        //遍历增强for
        for(Person person:treeSet){
            System.out.println (person);
        }

        //迭代器

        Iterator<Person> iterator=treeSet.iterator ();
        while (iterator.hasNext ()){
            System.out.println (iterator.next ());
        }
        
        //判断

        System.out.println (treeSet.contains (p1));
    }
}


(4)TreeSet的Comparator接口使用

reeSet也提供了一个带比较器Comparator的构造方法,使用匿名内部类来实现它:

  • 代码实现
package ch09_set;

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

/**
 * TreeSet的使用
 * Comparator:实现定制比较(比较器):自己定制比较规则
 * Comparable:是可比较的
 * @author 18902
 *
 */
public class Demo4 {
    public static void main(String[] args) {

        //在创建集合时 就指定比较规则
        TreeSet<Person> treeSet=new TreeSet<> (new Comparator<Person> () {
            @Override
            public int compare(Person o1, Person o2) {
                int n1=o1.getAge ()-o2.getAge ();
                int n2=o1.getName ().compareTo (o2.getName ());
                return n1==0?n1:n2;
            }
        });
        //添加元素
        Person p1=new Person ("l",10);
        Person p2=new Person ("y",30);
        Person p3=new Person ("m",20);

        treeSet.add (p1);
        treeSet.add (p2);
        treeSet.add (p3);

        System.out.println (treeSet.toString ());
    }
}

  • 先按照年龄进行比较,再按照姓名进行比较
    在这里插入图片描述

(5)TreeSet案例

package ch09_set;

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

/**
 * 使用TreeSet集合实现字符串按照长度进行排序
 * Comparator接口实现定制比较
 * @author 18902
 * @date 2021/3/16 23:17
 */
public class Demo5 {
    public static void main(String[] args) {
        TreeSet<String> treeSet=new TreeSet<> (new Comparator<String> () {
            @Override
            public int compare(String o1, String o2) {
                int n1= o1.length ()-o2.length ();
                int n2=o1.compareTo (o2);
                return n1==0?n2:n1;
            }
        });
        treeSet.add ("helloWorld");
        treeSet.add ("lym");
        treeSet.add ("yummy");
        treeSet.add ("lisi");
        treeSet.add ("zhangsan");
        treeSet.add ("000613");
        //直接打印
        System.out.println (treeSet.toString ());
    }
}

在这里插入图片描述


(6)总结
最后做了一个脑图总结一下
在这里插入图片描述
♥set集合大概就到这里啦♥

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值