首页 > 其他分享 >TreeSet自定义对象compareTo(Object o)方法

TreeSet自定义对象compareTo(Object o)方法

时间:2024-04-04 16:33:33浏览次数:18  
标签:return 自定义 age Object Person add compareTo

java小白,最近学到TreeSet,我们都知道在存储自定义对象时,需要使用Comparable或使用Comparator 存储。

刚刚碰到这样一段代码。

public class Person implements Comparable {
    int age;
    String name;

    Person(int age,String name){
        this.age=age;
        this.name=name;

    }

    @Override
    public int compareTo(Object o) {
        Person p=(Person)o;
        if (p.age% 2 == 0) {
            return -1;
        } else {
            return 1;
        }
    }
}
public class Test1 {
    public static void main(String[] args) {
        TreeSet<Person> treeSet = new TreeSet<>();
        treeSet.add(new Person(1,"aa"));
        treeSet.add(new Person(2,"cc"));
        treeSet.add(new Person(3,"bb"));
        treeSet.add(new Person(4,"dd"));
        treeSet.add(new Person(5,"ee"));


        for (Person p : treeSet) {
            System.out.println(p.age);
        }
}

执行结果为:

1
3
5
4
2

自己刚开始对compareTo(Object o)方法不够了解,所以debug半天才弄明白。

现在分享下思路:

compareTo(Object o)方法中的Object o 为当前集合中所存在的元素对象,一般我们正常比大小时,比如将代码写成按age大小升序排列:

 @Override
    public int compareTo(Object o) {
        Person p=(Person)o;
        return this.age-p.age;
    }

然后主方法按照age=1 2 3 4 5依次插入对象时,第一次直接插入1;第二次插入2时,age=2的当前对象将与集合中所有元素按照compareTo(Object o)中的规则一一比较,即this.age-p.age=2-1,return 1,表示当前对象(age=2)比集合内对象(age=1)大,345依次比较集合内元素所以主方法遍历集合结果为:12345。

但当compareTo(Object o)方法如下时,其比较规则发生变化。

 @Override
    public int compareTo(Object o) {
        Person p=(Person)o;
        if (p.age% 2 == 0) {
            return -1;
        } else {
            return 1;
        }
    }

运行程序过程如下,第一次还是插入1。第二次开始与集合中的元素相比较时,当前元素(this.age)能否比集合内元素(p.age)大,完全取决于被比较的元素(p.age)是否为单数。

如果被比较元素为单数则return 1,表示当前元素大于集合内被比较的元素。例如第二次插入2时,2和1的大小,取决于1。1不能被2整除所以return 1,表示2比1大。

第三次add传入3,3按照compareTo方法规则分别与1,2进行比较,得出3>1且3<2

第四次add传入4,4按照compareTo方法规则分别与1,2,3进行比较,得出2>4>3>1

第五次传入5,5按照compareTo方法规则分别与1,2,3,4进行比较,得出1<3<5<4<2

因而结果为13542。

树形结构如下:

以上是本人小白理解,如有错误烦请大佬指正,谢谢。

标签:return,自定义,age,Object,Person,add,compareTo
From: https://blog.csdn.net/m0_56471030/article/details/137376431

相关文章

  • 中间件 ZK分布式专题与Dubbo微服务入门 6-12 acl -自定义用户权限
    0课程地址https://coding.imooc.com/lesson/201.html#mid=12728 1重点关注1.1本节内容通过schema为digest密文的形式设置用户权限,调用权限 1.2关键代码//自定义用户认证访问List<ACL>acls=newArrayList<ACL>();......
  • Object类解释
    equals方法==和equals的区别==:是一个比较运算符既可以判断基本类型也可以判定引用类型。如果判断基本类型,判断的是值是否相等。如果判断引用类型,判断的是地址是否相等(判断是否为同一对象)equals方法:是Object类中的方法,只能判断引用类型,默认判断的是地址是否相等,子类通常重......
  • Java Object类、Objects类
    Object类Object类是Java中所有类的根类,它提供了一些通用的方法,用于处理对象的基本行为。以下是Object类的一些主要特点:继承性:在Java中,除非特别指定,否则每个类都隐式地继承自Object类。这意味着即使没有明确地将一个类声明为继承自Object,它也会自动继承Object类的所有属性和......
  • 如何根据JSON文件内容生成自定义对象
    在Python中,你可以使用json模块来解析JSON文件,并将解析后的数据映射到自定义的Python对象上。这通常涉及到定义一个类,并为该类实现一个__init__方法来初始化对象的属性。然后,你可以编写一个函数来读取JSON文件,将解析后的数据传递给类的构造函数,从而创建自定义对象。下面是一个简单......
  • 自定义系统服务
    Systemd是什么Systemd是Linux系统下的一个系统和服务管理器,它负责启动其它程序并运行为PID1的进程。其开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果,最终代替常用的SystemV与BSD风格init程......
  • 提升办公效率,一起了解流程自定义表单优势
    提高办公效率,可以一起了解低代码技术平台。对于很多中小型企业而言,低代码技术平台及流程自定义表单优势突出,是助力企业实现流程化办公,实现数字化转型的得力助手。流辰信息是专业研发开发平台、数据治理、数据分析等产品的服务商,是众多客户理想的合作伙伴。一起来了解低代码技术平......
  • keycloak~在认证的action中自定义重定向地址
    场景与实现逻辑我的登录接口,在输入账号密码成功后进行中间页中间页可以通过添加Authenticator的实现类来写逻辑authenticate方法是渲染页面的,action方法是提交表单后的逻辑context.success()方法表示认证成功,将进行重写向操作可以通过Response.status(302).header(HttpHeade......
  • 3D Object Detection Essay Reading 2024.04.01
    SwinTransformerpaper:https://arxiv.org/abs/2103.14030(ICCV2021)code:https://github.com/microsoft/Swin-Transformer/blob/2622619f70760b60a42b996f5fcbe7c9d2e7ca57/models/swin_transformer.py#L458学习链接:https://blog.csdn.net/qq_37541097/article/detail......
  • Nuxt3-自定义路由配置以及使用自定义布局layout
    一、不自定义路由下,如何使用自定义布局1、根目录下app.vue<template><div><NuxtLayout><NuxtPage/></NuxtLayout></div></template>2、layout文件夹下新建文件main.vue<template><divclass="_app">......
  • spring security 6.0.8(boot 3.0.13)自定义 filter 踩坑-已解决
    springboot3.0.13(3.1.10)springsecurity6.0.8(6.1.8)-- 官方文档:https://docs.spring.io/spring-security/reference/index.html写文时最新为6.2.3。  说明,先是用springboot3.1.10测试,失败,降低到3.0.13仍然失败。 开发建立了AppLoginFilter,实现了attemp......