treeset类

来源:互联网 发布:在淘宝上买书需要什么 编辑:程序博客网 时间:2024/06/07 06:44

今天刚学习了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出了一个比较器。

原创粉丝点击