TreeSet的使用

TreeSet的使用

TreeSet存储结构:红黑树
TreeSet是SortedSet接口的实现类,TreeSet存储的对象类型必须实现comparable接口,从而确定排序规则,实现接口时可以使用泛型指定接口类型,comparable接口的compareTo()方法可以确定添加的对象元素是否重复,如果compareTo()方法返回0,则认为是重复元素,添加元素失败

其中添加元素是无序的,但是会根据一定规则排序,比如根据添加的元素的首字母排序,数字大小排序

如果TreeSet存储的对象类型没有实现Comparable接口将会抛出

java.lang.ClassCastExceptioncom.collection.demo12.Student cannot be cast to java.lang.Comparable

异常,因为红黑树的比较规则无法确定,必须通过实现接口告诉TreeSet如何去比较

Student类(实现comparable接口并且重写compareTo()方法)

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

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = 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;
    }


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


    //先按姓名比,再按年龄比
    @Override
    public int compareTo(Student o) {
        int n1 = this.getName().compareTo(o.getName());
        //n1=0说明name是一样的,这里的compareTO()方法是字符串的,因为获得的名字是字符串
        int n2 = this.age-o.getAge();
        return n1==0?n2:n1;
    }
}

TreeSet类的使用

/**
 * 使用TreeSet保存数据
 * 存储结构:红黑树
 * 要求:元素必须实现Comparable接口,才能确定比较规则,再通过接口的compareTO()方法,如果返回值为0,认为是重复元素
 */
public class Test {
    public static void main(String[] args) {
        //创建集合
        TreeSet<Student> students = new TreeSet<>();

        //1添加元素
        Student s1 = new Student("xyxy", 25);
        Student s2 = new Student("hello", 28);
        Student s3= new Student("abc", 55);
        Student s4 = new Student("jk", 65);

        students.add(s1);
        students.add(s2);
        students.add(s3);
        students.add(s4);

         System.out.println(students.size());
        //如果Student类没有实现Comparable接口,将会抛出java.lang.ClassCastException异常,因为红黑树的比较规则无法确定
        System.out.println(students.toString());
        //[Student{name='abc', age=55}, Student{name='hello', age=28}, Student{name='jk', age=65}, Student{name='xyxy', age=25}]
        //排序规则:字母排序,数字排序,如果添加的对象姓名相同,年龄不同,就按照年龄大小来排序

        //2删除元素
        students.remove(s1);
        students.remove(new Student("hello", 28));
        //以上删除方法可行,因为Student类重写了compareTo()方法,可以确认元素是否重复
        System.out.println(students.size());
        System.out.println(students.toString());

        //3遍历
        //3.1增强for循环
        System.out.println("=============增强for循环=================");
        for(Student s:students){
            System.out.println(s);
        }
        //3.2迭代器
        System.out.println("===============迭代器=================");
        Iterator<Student> iterator = students.iterator();
        while (iterator.hasNext()){
            Student next = iterator.next();
            System.out.println(next);
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yuan_boss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值