TreeSet对String类型等是可排序的,对于自定义的类型来说,TreeSet无法进行自动排序

本文探讨如何在Java中使用TreeSet对自定义类型如Student进行排序,强调了实现Comparable接口的重要性,以及如何编写compareTo方法以定义元素间的比较规则。

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

TreeSet对String类型等是可排序的;
1.TreeSet集合底层实际上是一个TreeMap
2.TreeMap集合底层是一个二叉树
3.放到Treeset集合中的元素,等同于放到TreeMap集合Key部分
4.TreeSet集合中的元素:无序不可重复,但是可以按照元素的大小顺序自动排序,称为:可排序集合

package Mapiiiiii;

import java.util.TreeSet;
public class TreeSetStringtest {
    public static void main(String[] args) {
        TreeSet<String> treeSet=new TreeSet();
        treeSet.add("ab");
        treeSet.add("vrt");
        treeSet.add("cft");
        treeSet.add("bvf");
        treeSet.add("abc");
        treeSet.add("abd");
        for(String str:treeSet){
            System.out.println(str);
        }
        System.out.println("============");
        TreeSet<Integer> tree=new TreeSet();
        tree.add(1233);
        tree.add(1);
        tree.add(12);
        tree.add(123);
        tree.add(124);

        for (Integer s:tree){
            System.out.println(s);
        }
    }
}

在这里插入图片描述
对于自定义的类型来说,TreeSet无法进行自动排序
定义一个Student类型,对于Student类型来说,无法排序
因为没有指定Student对象之间的比较规则。
以下程序运行会出现异常:Mapiiiiii.Student cannot be cast to java.lang.Comparable
出现这个异常的原因是:
其他类型源码中都有Comparable。
在这里插入图片描述

Student类没有实现java.lang.Comparable接口

package Mapiiiiii;

import java.util.TreeSet;
public class ZDyitest {
    public static void main(String[] args) {
        TreeSet<Student> tree = new TreeSet<>();
        Student s1 = new Student(32);
        Student s2 = new Student(3);
        Student s3 = new Student(40);
        Student s4 = new Student(31);
        tree.add(s1);
        tree.add(s2);
        tree.add(s3);
        tree.add(s4);
        //遍历
        for (Student s: tree){
            System.out.println(s);
        }
    }
}
class Student{
    int age;

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

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                '}';
    }
}

在这里插入图片描述
放在TreeSet集合中的元素要实现:java.lang.Comparable接口,并且实现compareTo方法,equals方法可以不写

package Mapiiiiii;

import java.util.TreeSet;
public class ZDyitest {
    public static void main(String[] args) {
        TreeSet<Student> tree = new TreeSet<>();
        Student s1 = new Student(32);
        Student s2 = new Student(3);
        Student s3 = new Student(40);
        Student s4 = new Student(31);
        tree.add(s1);
        tree.add(s2);
        tree.add(s3);
        tree.add(s4);
        //遍历
        for (Student s: tree){
            System.out.println(s);
        }
    }
}

//放在TreeSet集合中的元素要实现:java.lang.Comparable接口,
// 并且实现compareTo方法,equals方法可以不写**
class Student implements Comparable<Student>{
    int age;
    public Student(int age) {
        this.age=age;
    }
    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                '}';
    }
     //需要在这个方法中编写比较的逻辑,按照什么进行比较
    //比较规则还是需要我们自己去写
    //k.compareTo(t.key)
    //拿着参数k和集合中的每一个元素k进行比较
    @Override
    public int compareTo(Student student) {
        /*
        this是c1 ,student是c2
        c1和c2比较的时候,就是this和student比较
         */
        return this.age-student.age;//用到了二叉排序树的知识
    }
}

在这里插入图片描述

自己写了比较规则后就会按照自己的规则排序了。
再练习写一下比较规则

package Mapiiiiii;

import java.util.TreeSet;

public class ZidingRuletest {
    public static void main(String[] args) {
        TreeSet<user>  tr=new TreeSet<>();
        //以下两种方法都可以
        /*user u1=new user("xiaoming",45);
        user u2=new user("xiaohua",43);
        user u3=new user("wanggui",45);
        user u4=new user("lihai",21);
        user u5=new user("zhangsan",25);
        tr.add(u1);
        tr.add(u2);
        tr.add(u3);
        tr.add(u4);
        tr.add(u5);
        */
        tr.add(new user("xiaoming",45));
        tr.add(new user("xiaohua",43));
        tr.add(new user("wanggui",45));
        tr.add(new user("lihai",21));
        tr.add(new user("zhangsan",25));

        for(user u:tr){
            System.out.println(u);
        }

    }
}

class user implements Comparable<user>{

    String name;
    int age;
    public user() {
    }

    public user(String name,int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "user{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public int compareTo(user user) {
        //年龄相同时按照名字排序
        //姓名是String类型,可以直接调用compareTo来完成比较
        if(this.age==user.age){
            return this.name.compareTo(user.name);
        }else
            return this.age-user.age;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小心!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值