treeset类

今天刚学习了treeset类,这个类是有序的,而且实现使用使用的树

先简单的比较一下几个set类:

Set(interface )
存入set的每个原酸都必须是唯一的, 因为set不保存重复元素,加入set的元素必须定义equals方法以确保对象的唯一性。set与collection有完全一样的接口,set接口不保证维护元素的次序。
Hashset
为了快速查找而设计的set存入hashset的元素必须定义hashcode,如果没有其他限制,这是默认的选择
Treeset
保持次序的set,底层为树结构,使用它可以从set中提取有序的序列。元素必须实现comparable接口
Linkedhashset 具有hashset的查询速度,而内部结构使用链表维护元素顺序,插入的顺序,于是在使用迭代器遍历set时,结果会按照元素的插入顺序显示,元素也必须定义hashcode()方法。

自然排序

对于自然排序,在执行add方法的时候,treeset会调用compareTo方法,所以被添加的实体类必须实现comparable接口。
然后实现compareto方法,在定义中返回值为int,如果调用者大于被调用者返回1,反之返回-1,相等为0,所以如果返回为0则插入重复数据。倘若想要实现自然排序,就将泛型写为要排序的类:
例子如下:

public class Yuangong implements Comparable<Yuangong>{}//实现接口
public int compareTo(Yuangong o) {
        // TODO Auto-generated method stub
        if(this.getAge()!=o.getAge())
            if(this.getAge()>o.getAge())
                return 1;
            if(this.getAge()<o.getAge())
                return -1;
                //age按照升序排列
            else if(this.getGongling()!=o.getGongling())
                if(this.getGongling()>o.getGongling())
                    return -1;
                if(this.getGongling()<o.getGongling())
                    return 1;
                    //如果年龄相同,工龄按照降序排列
            else if(this.getXinshui()!=o.getXinshui())
                    if(this.getXinshui()>o.getXinshui())
                        return -1;
                    if(this.getXinshui()<o.getXinshui())
                        return 1;
                        //如果依旧相同,将按照工资降序排列
        return 0;//全部相同,返回0
    }

在主函数中:

Yuangong y5=new Yuangong(13, 10, 2344);
        Yuangong y1=new Yuangong(10, 10, 1000);
        Yuangong y4=new Yuangong(13, 10, 1230);
        Yuangong y2=new Yuangong(10, 11, 1000);
        Yuangong y3=new Yuangong(13, 11, 1000);


        TreeSet<Yuangong> t4=new TreeSet<Yuangong>();
        t4.add(y1);
        t4.add(y2);
        t4.add(y3);
        t4.add(y4);
        t4.add(y5);
        System.out.println(t4);

定义5个员工,然后add进入treeset中,输入出来就是已经排序好的。

定义排序

另外就是定义排序
也就是定义一个类,实现comparator接口,这就是一个比较器,然后在类中,重写方法compare()
在创建treeset对象时,通过调用构造方法:

TreeSet(Comparator<? super E> comparator) 
          //构造一个新的空 TreeSet,它根据指定比较器进行排序。

然后添加数据。
实现如下:

public class paixu implements Comparator<Yuangong>{}

然后实现方法

@Override
    public int compare(Yuangong o1, Yuangong o2) {
        if(o1.getAge()!=o2.getAge())
            if(o1.getAge()>o2.getAge())
                return 1;
            if(o1.getAge()<o2.getAge())
                return -1;
            else if(o1.getGongling()!=o2.getGongling())
                if(o1.getGongling()>o2.getGongling())
                    return -1;
                if(o1.getGongling()<o2.getGongling())
                    return 1;
            else if(o1.getXinshui()!=o2.getXinshui())
                    if(o1.getXinshui()>o2.getXinshui())
                        return -1;
                    if(o1.getXinshui()<o2.getXinshui())
                        return 1;
        return 0;
    }

基本实现差不多,不过比较器是单独出来的一个类,在使用上会比上面的方便很多。
然后主函数的初始化也需要改变如下

TreeSet<Yuangong> t4=new TreeSet<Yuangong>(new paixu());

也就是调用了上面的有参构造方法,new出了一个比较器。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值