Compareable接口的compareTo方法详解

2023-11-08

Compareable接口可以实现类中成员属性的排序方法。通过重写Compareable接口中的CompareTo方法实现自定义规则的排序。

针对Compareable接口的排序方式,将通过对学生类和测试类进行一个代码演示

一般情况下

一般情况下Compareable接口是实现自然排序,即依照对象的添加顺序进行排序。如果CompareTo方法中返回的是正整数那么将依照添加顺序正序排序,如果是负整数依照添加顺序逆序排序

//student类
public class d_stu implements Comparable<d_stu>{
    //通过对Comparable接口的实现 重写CompareTo方法实现排序规则的自定义
    @Override
    public int compareTo(d_stu o) {
        return -1;//这里直接要求返回-1 所以将按照添加顺序逆序排序
    }
​
    public  String name;
    public int age;
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    @Override
    public String toString() {
        return "d_stu{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
​
import java.util.Iterator;
import java.util.TreeSet;
​
public class demo1 {
    public static void main(String[] args) {
        d_stu d1= new d_stu();
        d_stu d2=new d_stu();
        d_stu d3=new d_stu();
        d_stu d4=new d_stu();
        d_stu d5=new d_stu();
        d1.setName("张三");
        d1.setAge(15);
        d2.setName("李四");
        d2.setAge(14);
        d3.setName("王五");
        d3.setAge(19);
        d4.setName("马六");
        d5.setAge(18);
        d5.setName("jakc");
        d4.setAge(16);
//创建TreeSet集合 将元素添加进去
        TreeSet<d_stu>ts=new TreeSet<>();
        ts.add(d1);
        ts.add(d2);
        ts.add(d3);
        ts.add(d5);
        ts.add(d4);
​
        Iterator<d_stu>it=ts.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }
}
​

最终程序的运行结果如下,

 

也就是说在直接返回指定数字的情况下。
**如果是负整数的话CompareTo方法将依照元素的添加顺序在输出的时候逆序输出。**
​
**那么是正整数的话就将按照元素的添加顺序在输出的时候正序输出。**
​
**是零的话就另外考虑**

重写方法后

重写方法后也分如下几种情况

成员变量-局部变量

将依据参照变量进行升序排序

//student类
public class d_stu implements Comparable<d_stu>{
    //重写compareTo方法 这里使用成员变量减去局部变量的方式
    @Override
    public int compareTo(d_stu o) {
        return this.getAge()-o.getAge();
        //这里使用age作为参照变量
    }
​
    public  String name;
    public int age;
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    @Override
    public String toString() {
        return "d_stu{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
​
//测试类
import java.util.Iterator;
import java.util.TreeSet;
​
public class demo1 {
    public static void main(String[] args) {
        d_stu d1= new d_stu();
        d_stu d2=new d_stu();
        d_stu d3=new d_stu();
        d_stu d4=new d_stu();
        d_stu d5=new d_stu();
        d1.setName("张三");
        d1.setAge(15);
        d2.setName("李四");
        d2.setAge(14);
        d3.setName("王五");
        d3.setAge(19);
        d4.setName("马六");
        d4.setAge(16);
        d5.setName("jakc");
        d5.setAge(18);
​
        TreeSet<d_stu>ts=new TreeSet<>();
        ts.add(d1);
        ts.add(d2);
        ts.add(d3);
        ts.add(d4);
        ts.add(d5);
​
        Iterator<d_stu>it=ts.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }
}
​

程序最终运行效果图

 

局部变量-成员变量

将依据参照变量进行降序排序

//student类
public class d_stu implements Comparable<d_stu>{
    //这里重写compareTo方法 采取局部变量减成员变量的方法
    //参照变量为age
    @Override
    public int compareTo(d_stu o) {
        return o.getAge()-this.getAge();
    }
​
    public  String name;
    public int age;
​
    public int getAge() {
        return age;
    }
​
    public void setAge(int age) {
        this.age = age;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    @Override
    public String toString() {
        return "d_stu{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
​
//测试类
import java.util.Iterator;
import java.util.TreeSet;
​
public class demo1 {
    public static void main(String[] args) {
        d_stu d1= new d_stu();
        d_stu d2=new d_stu();
        d_stu d3=new d_stu();
        d_stu d4=new d_stu();
        d_stu d5=new d_stu();
        d1.setName("张三");
        d1.setAge(15);
        d2.setName("李四");
        d2.setAge(14);
        d3.setName("王五");
        d3.setAge(19);
        d4.setName("马六");
        d4.setAge(16);
        d5.setName("jakc");
        d5.setAge(18);
​
        TreeSet<d_stu>ts=new TreeSet<>();
        ts.add(d1);
        ts.add(d2);
        ts.add(d3);
        ts.add(d4);
        ts.add(d5);
​
        Iterator<d_stu>it=ts.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }
}

程序最终运行效果

 

小结:

针对自定义类对Compareable接口的实现。采取重写compareTo方法的方式可以自定义排序规则。

如果直接在comparaTo方法中返回数值的话。那么排序规则就将判断这个数是正整数还是负整数或者是零来进行排序。如果是正整数就将依照元素的添加顺序采取顺排序。如果是负整数就将依照元素的添加顺序采取倒序排序

如果在重写compareTo方法中采取成员变量减局部变量的方式。那么就将依照表达式中的参照变量进行升序排序

如果在重写compareTo方法中采取局部变量减成员变量的方式。那么将依照表达式中的参照变量进行降序排序

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Compareable接口的compareTo方法详解 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • 在 java 类和 android 活动之间传输时音频不清晰

    我有一个android活动 它连接到一个java类并以套接字的形式向它发送数据包 该类接收声音数据包并将它们扔到 PC 扬声器 该代码运行良好 但在 PC 扬声器中播放声音时会出现持续的抖动 中断 安卓活动 public class Sen
  • 制作一个交互式Windows服务

    我希望我的 Java 应用程序成为交互式 Windows 服务 用户登录时具有 GUI 的 Windows 服务 我搜索了这个 我发现这样做的方法是有两个程序 第一个是服务 第二个是 GUI 程序并使它们进行通信 服务将从 GUI 程序获取
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 如何在 javadoc 中使用“<”和“>”而不进行格式化?

    如果我写
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 使用 JMF 创建 RTP 流时出现问题

    我正处于一个项目的早期阶段 需要使用 RTP 广播DataStream创建自MediaLocation 我正在遵循一些示例代码 该代码目前在rptManager initalize localAddress 出现错误 无法打开本地数据端口
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O

随机推荐

  • win下使用git-bash工具进行ssh免密登录服务器

    1 ssh keygen exe 生成公钥私钥 pub 2 ssh agent exe bash 指定工具 3 ssh add exe 添加私钥 OK
  • nacos注册中心的配置

    将nacos作为注册中心使用 使用的步骤 导入nacos依赖 这么导
  • 选路算法(计算机网络)

    目的 决定从源到目的地通过网络的 好的路径 一般指最小费用的路径 根据算法是静态的还是动态的进行分类 静态 路由随时间缓慢变化 手工配置 动态 路由更快地变化 周期的更新 适应链路费用和网络拓扑变化 根据算法是全局式的还是分散式的来加以区分
  • Python入门指南:从零开始学习Python编程

    文章目录 前言 安装Python 变量以及数据类型 总结 前言 Python是一种简单而又强大的编程语言 它在全球范围内广受欢迎 适用于各种应用场景 包括Web开发 数据分析 人工智能和科学计算等 本篇博客将为初学者提供一份Python入门
  • 【抗扰PID控制】干扰抑制PID控制器研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 Simulink 文章讲解 1 概述 文献来源 抗扰PI
  • 背景图片设置透明度

    div position relative background color eee background moz linear gradient 30deg eff8fd 0 f0f9fe 40 c4e2fe 80 9cbee6 100
  • 计算损失函数C语言,EAST 算法超详细源码解析(四)、损失函数

    Date 2020 05 19 Author CW 前言 EAST 的损失函数由三部分构成 对应预测输出的三个map score map loc map 以及 angle map 即分类损失 位置 点到文本框边界上下左右的距离 损失以及角度
  • stm32—通用定时器实验设计

    stm32定时器编写 stm32定时器编写 1 打开项目 2 在timer h中完成定时器中断实现步骤 a 使能定时器函数 b 初始化定时器 备注 c 开启定时器中断 配置NVIC d 使能定时器 3 写入中断服务函数 中断函数完成后 开始
  • 使用react脚手架快速搭建项目以及项目文件的介绍(目录文件的功能及作用)

    前言 本篇文章教大家使用脚手架搭建react的项目 对于新建的react项目 项目目录里的文件都是干什么的 有什么作用呢 下面一起来看看 react脚手架 使用yarn在本地安装create react app npm i g yarn 全
  • Easylogging++之配置功能

    要完成Easylogging 日志的配置功能 可以通过三种方式实现 而且每一种方法都非常简单 使用配置文件 这种方法的好处就是只要修改配置文件即可实现日志格式的重新配置 而不需要修改源程序代码 缺点就是发布程序时必须打包配置文件一起发布 否
  • 常见架构模式 #CSDN博文精选# #IT技术# #软件模式# #架构模式#

    大家好 小C将继续与你们见面 带来精选的CSDN博文 又到周一啦 上周的系统化学习专栏已经结束 我们总共一起学习了20篇文章 这周将开启全新专栏 放假不停学 全栈工程师养成记 在这里 你将收获 将系统化学习理论运用于实践 系统学习IT技术
  • 计算机操作系统 (王道考研)笔记(一)

    重点知识点 1 并发 并行 2 电脑开机过程 3 程序 进程 4 进程 4 1 进程的组成与控制 进程的状态与转换 4 1 1 进程的组成 4 1 2 进程控制 4 1 3 进程的状态与转换 4 1 4 程序的切换 4 2 进程通信 4 2
  • 由计数排序衍生出来的桶排序

    计数排序说白了 就是拿一个列表来记录list里的数对应count的下标出现的次数 最后利用count的统计打印出来即可 下面来看看桶排序 针对较多的数据排序 将数据分为n个桶 列表遍历 冒泡排序逆用 确保每个桶里有序 直到最后将内个桶的数据
  • mysql查询时取多条记录中最大时间的记录

    在查询的过程中 有时库里单个用户的数据往往会存在很多条 当我们需要查询出用户的一条数据时 最大时间对应记录或最小时间对应记录 往往要写很复杂的子查询 而其实通过一个简单的方法就可以查询 就是使用concat函数 就可以非常简单的查询出相应的
  • 小技巧(8):Word中自定义目录,并设置自动目录的格式

    文章目录 一 对正文中的目录设置大纲级别 1 1 通过样式设置标题级别 1 2 通过段落设置标题级别 二 设定自定义目录格式 2 1 生成自定义目录 2 2 设置显示大纲级别 2 3 设置不同级别目录的显示格式 一 对正文中的目录设置大纲级
  • vsftpd的安装和使用

    目录 1 vsftpd的简介 2 2 特点 2 3 安装 2 4 创建虚拟用户 2 5 vsftpd服务器的配置 4 6 vsftpd配置文件说明 7 7 防火墙的配置 8 8 vsftpd的验证 9 9 vsftpd的常用命令 10 10
  • sql 递归查询_SQL如何求解递归问题?

    点击上方SQL数据库开发 关注获取SQL视频教程 SQL专栏SQL数据库基础知识汇总SQL数据库高级知识汇总 递归 递归是指程序调用自身的一种编程技巧 在SQL中也有递归查询 下面我们通过一个省市区的示例来讲解递归查询的用法 问题 有如下一
  • 【C语言刷题2】

    1 杨辉三角 思路 首先观察一下示例 会发现需要一个二维数组来帮助解题 根据题目描述 会发现每一行的元素个数等于行数 并且每行首尾元素都是1 中间的元素都是左上角和上方元素和 这样我们就可以建立一个选择语句if else 如果是每行第一个或
  • UE4 C++ Timeline

    UE4 C Timeline 我命名有点不规范注意点看 结束事件绑定 每次更改绑定 调用时间轴开始方法方法 1 先建C 类 用碰撞触发时间轴 代码 h Fill out your copyright notice in the Descri
  • Compareable接口的compareTo方法详解

    Compareable接口可以实现类中成员属性的排序方法 通过重写Compareable接口中的CompareTo方法实现自定义规则的排序 针对Compareable接口的排序方式 将通过对学生类和测试类进行一个代码演示 一般情况下 一般情