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