Java中的TreeSet

本文介绍了如何使用TreeSet集合存储自定义对象,包括利用自然排序(Comparable接口)和比较器(Comparator接口)对元素进行排序。通过实例演示了如何根据年龄和姓名规则对学生对象进行排序,并展示了两种不同的排序策略:无参构造的自然排序和带参构造的比较器排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TreeSet集合的特点

  • 元素有序,这里的顺序不是指存储和取出的顺序,而是按照一定的规则进行排序,具体排序方式取决于构造方法
    TreeSet():根据其元素的自然排序进行排序
    TreeSet(Comparator comparator):根据指定的比较器进行排序
  • 没有带索引的方法,所以不能使用普通for循环遍历
  • 由于是Set集合,所以不包含重复元素的集合

存储整数并遍历

//创建集合对象
        TreeSet<Integer> ts = new TreeSet<Integer>();
        //注意不能用 int ,因为集合只能存储引用类型;应该用 int 类型的包装类类型Integer

        //添加元素,添加顺序是随便的
        ts.add(10);
        ts.add(30);
        ts.add(50);
        ts.add(40);
        ts.add(20);

		ts.add(30);//重复

        //遍历集合
        for(Integer i:ts){
            System.out.println(i);
        }

输出:

10
20
30
40
50

输出是按大小顺序的

自然排序Comparable的使用

  • 存储学生对象并遍历,创建TreeSet集合使用无参构造方法
  • 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

学生类:

public class Student implements Comparable<Student>{//实现Comparable接口
    private String name;
    private int age;

    public Student(){}
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name){
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //重写排序方法
    @Override
    public int compareTo(Student s){

        int num = this.age - s.age;//按年龄从小到大排序

        //如果年龄相同,判断姓名是否相同
        if(num == 0){
            if(!this.name.equals(s.name)){//判断年龄是否相同
                return this.name.charAt(0) - s.name.charAt(0);//首字母的大小比较
            }
        }
            return num;

        /*

        //用三元运算符更简洁
        int num = this.age - s.age;//按年龄从小到大排序

        //如果num 为0 就比较姓名是否相同,姓名相同就按字母大小排序
        int num2 = num == 0? this.name.compareTo(s.name):num;
        return num2;

         */
    }
}

Demo:

import java.util.TreeSet;

public class Demo {

    public static void main(String[] args) {

        //创建集合对象
        TreeSet<Student> ts = new TreeSet<Student>();//无参构造

        //创建学生对象,写拼音方便看
        Student s1 = new Student("xushi",29);
        Student s2 = new Student("huangzhaojun",28);
        Student s3 = new Student("diaochan",30);
        Student s4 = new Student("yangyuhuang",18);

        Student s5 = new Student("meinv",18);//年龄相同,姓名不同
        Student s6 = new Student("diaochan",15);//姓名相同,年龄不同(实现中也有同名的人嘛)
        Student s7 = new Student("diaochan",15);//姓名和姓名相同

        //把学生添加到集合
        ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);
        ts.add(s5);ts.add(s6);ts.add(s7);

        //遍历集合
        for (Student s:ts){
            System.out.println(s.getName()+","+s.getAge());
        }
    }
}

输出:

diaochan,15
meinv,18
yangyuhuang,18
huangzhaojun,28
xushi,29
diaochan,30

结论

  • 用TreeSet集合存储自定义对象,无参构造方法使用的是自然排序对元素进行排序的
  • 自然排序,就是让元素所属的类实现Comparable接口,重写compareTo(To)方法

比较排序Comparator的使用

  • 存储学生对象并遍历,创建TreeSet集合使用带参构造方法
  • 要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序

步骤一:

  • 由上一题的学生类我们照用,但是重写的compareTo方法我们要删掉,再来使用。

步骤二:

  • 上一题的Demo类我们照用,但我们要修改一下创建对象的过程。
import java.util.Comparator;
import java.util.TreeSet;

public class Demo {

    public static void main(String[] args) {

        //创建集合对象,带参构造
        TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                int num = s1.getAge() - s2.getAge();//判断年龄是否相同
                num = num == 0?s1.getName().compareTo(s2.getName()):num;//年龄不相同的时候,比较姓名
                return num;
            }
        });

        //创建学生对象,写拼音方便看
        Student s1 = new Student("xushi",29);
        Student s2 = new Student("huangzhaojun",28);
        Student s3 = new Student("diaochan",30);
        Student s4 = new Student("yangyuhuang",18);

        Student s5 = new Student("meinv",18);//年龄相同,姓名不同
        Student s6 = new Student("diaochan",15);//姓名相同,年龄不同(实现中也有同名的人嘛)
        Student s7 = new Student("diaochan",15);//姓名和姓名相同

        //把学生添加到集合
        ts.add(s1);ts.add(s2);ts.add(s3);ts.add(s4);
        ts.add(s5);ts.add(s6);ts.add(s7);

        //遍历集合
        for (Student s:ts){
            System.out.println(s.getName()+","+s.getAge());
        }
    }
}

输出:

diaochan,15
meinv,18
yangyuhuang,18
huangzhaojun,28
xushi,29
diaochan,30

结论:

  • TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
  • 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T O1, T o2)方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值