TreeSet使用--java学习笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44494648/article/details/99547652

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;
                }
        );

猜你喜欢

转载自blog.csdn.net/weixin_44494648/article/details/99547652