版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
TreeSet储存
自然顺序
‘使用ComparTo()方法,这是java.lang.Comparable接口中的方法。
一般使用该方法比较实现的升序叫自然排序
一些常用类已经实现了Comparable接口,并有比较大小的标准
- 数值类型的包装类,和大数类使用对应数值的大小来比较
- 字符类型按照UNICODE值进行比较
- String类型和字符型相同(这里提到的基本类型应该是其对应的包装类型)
- 日期类,早的日期小于晚的日期
其他自定义的类中,该方法比较时,可以依据某些属性比较,大于返回正,小于返回负,等于返回0,这是就是升序,反之,可以变成逆序
在给TreeSet中存储时,对象要实现这个接口,照类的属性设置,若没有实现,存储就会抛异常
- 但是要注意,CompartTo()方法和equals()要对应,不要出现CompartTo返回值为0但equals()返回值是false,这样就会很麻烦
因为,返回)时 认为他们相等,不能存,但equals不相等,没存进去不符合定义,所以写这两个方法时注意统一。 - 当向该集合中存入对象之后,如果在改变这写对象的实例变量,,这时,这个对象和其他的对象的大小发生了变化,但集合不会改变他们的顺序,再去删除这个对象时,可能就会出错,
定制排序
通过Comparator接口的帮助,该接口中有int compare(T o1,T o2);方法,若o1 大于o1 返回正数,小于是负数,等于是零
实现定制排序,就要在创建该集合时,提供一个Comparator对象与集合关联。代码如下
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class ComparatorTest {
public static void main(String[] args) {
TreeSet<M> ts=new TreeSet<>(new A());
ts.add(new M(3));
ts.add(new M(-3));
ts.add(new M(13));
ts.add(new M(-13));
//查看结果
Iterator it=ts.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
//一个继承 Comparator的类其中M是M类
class A<E> implements Comparator<M>{
//字节设置
@Override
public int compare(M o1, M o2) {
if(o1.a>o2.a){
return -1;
}else if(o1.a<o2.a){
return 1;
}else
return 0;
}
}
//没有实现Comparable接口的类
class M{
int a;
public M(int a) {
this.a = a;
}
@Override
public String toString() {
return "M{" +
"a=" + a +
'}';
}
}
上面可以简化,不用定义关联类A,使用lembda表达式,在定义的时直接传入方法
Lambda关于表达式可以看:Lambda表达式
下面只是对代码书写的简化,和之前的效果相同
TreeSet<M> ts1=new TreeSet<M>(
(o1,o2)->{
if(o1.a>o2.a){
return -1;
}else if(o1.a<o2.a){
return 1;
}else
return 0;
}
);