Java 集合 TreeSet 详解

TreeSet

TreeSet底层使用红黑树进行存储,可以按照插入对象的属性进行排序

要求,插入的对象,必须要是相同的类,否则会报错

报错的原因:

**因为在Set本身是用于存储无序的,不重复的元素,在HashSet和LinkedHashSet中使用equals()+hashCode()的方式进行判断,而对于TreeSet,因为其可以实现对插入对象的属性进行比较,所以插入的对象必须实现Comparable接口(自然排序)或在定义TreeSet时通过构造器填入Comparator接口的实现对象(定制排序)。所以TreeSet使用的判断元素是否相同也是使用的Comparable接口中的compareTo()方法或Comparator接口中的compare()方法 Comparator接口
Comparable接口

		TreeSet treeSet1 = new TreeSet();
		//Employee类中实现了Comparable接口
        treeSet1.add(new Employee("Tom",18,new MyDate(2002,3,5)));
        treeSet1.add(new Employee("Jerry",19,new MyDate(2001,6,5)));
        treeSet1.add(new Employee("Mary",22,new MyDate(1999,8,25)));
        treeSet1.add(new Employee("Bob",21,new MyDate(2000,9,15)));
        treeSet1.add(new Employee("Vector",23,new MyDate(1997,3,5)));

        System.out.println(treeSet1);

		//定制排序,匿名方式实现Comparator接口
        TreeSet treeSet2 = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                if (o1 instanceof Employee && o2 instanceof Employee){
                    Employee e1 = (Employee)o1;
                    Employee e2 = (Employee)o2;
                    if (e1.getBirthday().getYear() > e2.getBirthday().getYear()){
                        return 1;
                    }else if (e1.getBirthday().getYear() < e2.getBirthday().getYear()){
                        return -1;
                    }else {
                        if (e1.getBirthday().getMonth() > e2.getBirthday().getMonth()){
                            return 1;
                        }else if (e1.getBirthday().getMonth() < e2.getBirthday().getMonth()){
                            return -1;
                        }else {
                            if (e1.getBirthday().getDay() > e2.getBirthday().getDay()){
                                return 1;
                            }else if (e1.getBirthday().getDay() < e2.getBirthday().getDay()){
                                return -1;
                            }else return 0;
                        }
                    }
                }
                throw new RuntimeException("输入有误");
            }
        });

        treeSet2.add(new Employee("Tom",18,new MyDate(2002,3,5)));
        treeSet2.add(new Employee("Jerry",19,new MyDate(2001,6,5)));
        treeSet2.add(new Employee("Mary",22,new MyDate(1999,8,25)));
        treeSet2.add(new Employee("Bob",21,new MyDate(2000,9,15)));
        treeSet2.add(new Employee("Vector",23,new MyDate(2002,3,9)));


        System.out.println(treeSet2);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值