java基础:TreeSet

1.TreeSet介绍

TreeSet是SortedSet接口的实现类,可以确保集合元素处于排序状态,添加入TreeSet的元素会按照一定的顺序(自然排序或者定制排序)进行排列

2.TreeSet基础用法

举个栗子:
 

import java.util.TreeSet;

public class BaseCharacter {
    public static void main(String[]args){
        TreeSet nums=new TreeSet();
        nums.add(5);
        nums.add(7);
        nums.add(1);
        nums.add(3);
        //按顺序输出
        System.out.println("按顺序输出"+nums);
        //输出第一个元素
        System.out.println("输出第一个元素"+nums.first());
        //输出第二个元素
        System.out.println("输出最后一个元素"+nums.last());
        //返回小于4的子集
        System.out.println("返回小于4的子集"+nums.headSet(4));
        //返回大于2的子集
        System.out.println("返回大于2的子集"+nums.tailSet(2));
        //返回在某个区间中的数字
        System.out.println(nums.subSet(2,6));


    }
}

TreeSet可以进行首位元素的输出,也可以进行尾部数据的输出,同时可以区间的设定,填充入TreeSet的参数会以一种顺序输出

3.TreeSet的自然排序

3-1:为什么TreeSet可以进行排序操作呢?

java中提供了Comparable接口,该接口定义了一个compareTo方法,TreeSet会调用集合元素的compareTo(Object obj)方法来进行元素之间的比较(该方法返回一个int值),如果返回正整数 则前一个大于后一个,如果返回0 相等,如果返回负整数,后一个大于前一个。

上述代码为自然排序(升序操作)

扫描二维码关注公众号,回复: 9323221 查看本文章

3-2:自然排序的注意事项

*实现Comparable的常用类,如果使用了没有实现接口的类,程序会抛出异常

*如果希望去正常运作TreeSet TreeSet只能添加同一种类型的对象

*最好不要去修改已经加入TreeSet的值(和HashSet原理差不多,如果再次修改成相同的元素,使得效率严重降低)

*TreeSet判断两个对象相等的标准是,两个对象通过compareTo方法返回0 所以可以通过重写方法观察一下:

import java.util.Objects;
import java.util.TreeSet;

/**
 * 自然排序
 * TreeSet会调用元素的comapareTo方法比较元素之间的大小关系 然后将集合元素按照升序排列(自然排序)
 * 在java提供的Comparable接口中提供了compareTo(Object obj)方法,该方法返回一个整数值,如果返回的是0 表面相等
 * 如果返回的是正整数,表明obj1>obj2 如果返回的是负整数 表明obj1<obj2
 * BigDecimal Character Boolean String Date Time
 **如果没有实现Comparable接口 程序抛出异常
 * 如果希望去正常运作TreeSet TreeSet只能添加同一种类型的对象
 *
 * TreeSet判断两个对象相等的标准是,两个对象通过compareTo方法返回0
 * */
public class NatureSort {
    static class Z implements Comparable{
        int age;
        public Z(int age){
            this.age=age;
        }
        @Override
        public int compareTo(Object o) {
            return 1;
        }
    }
    public static void main(String[]args){
        TreeSet set=new TreeSet();
        Z z1=new Z(6);
        //加入元素 虽然两个元素一样 但是通过重写方法 依旧可以进行添加
        set.add(z1);
        set.add(z1);
        ((Z)set.first()).age=9;//修改第一个元素的变量
        System.out.println(((Z)set.first()).age);
        System.out.println(((Z)set.last()).age);



    }
}

在该方法中,虽然添加了两次z1,但是由于compareTo方法恒为1,所以依旧添加了相同的元素。(通过改变一个元素的值,第二个也被修改,所以证明两个元素为同一个对象的引用变量)

【但是这种做法十分危险 只在测试的时候使用!!】

3.TreeSet的定制排序

3-1:什么是定制排序?

通过Lambda表达式,进行对Comparator中规则的修改(下面的例子是把升序改为了降序),实现自定义排序规则

import java.util.TreeSet;

//定制排序
public class MyTreeSort {
    int age;
    public MyTreeSort(int age){
        this.age=age;
    }
    public String toString(){
        return "MyTreeSort[age:"+age+"]";
    }
    public static void main(String[]args){
        //使用正则表达式对Comparator规则进行修改
        TreeSet ts=new TreeSet((o1, o2) -> {
            MyTreeSort m1=(MyTreeSort)o1;
            MyTreeSort m2=(MyTreeSort)o2;
            //具体改变规则
            return m1.age>m2.age? -1:m1.age<m2.age?1:0;
        });
        ts.add(new MyTreeSort(4));
        ts.add(new MyTreeSort(6));
        ts.add(new MyTreeSort(3));
        ts.add(new MyTreeSort(2));
        System.out.println(ts);
    }
}
发布了193 篇原创文章 · 获赞 70 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/Lzinner/article/details/89489250
今日推荐