【Java】对象数组排序(Comparable接口/Comparator接口)

news2024/9/18 10:38:08

Comparable接口(compareTo)

Arrays 类中的 sort 方法承诺可以对对象数组进行排序,但要求满足下列前提:对象所属的类必须实现了 Comparable 接口,且定义了compareTo方法。

Comparable接口的代码

public interface Comparable
{
	int compareTo(Object other);
}

在 JavaSE 5.0 中,Comparable 接口已经改进为泛型类型。
在这里插入图片描述

代码实例

希望使用 Arrays 类的 sort 方法对 Employee 对象数组进行排序, Employee 类就必须实现Comparable 接口。这里的 Employee 类需要提供 compareTo 方法。 假设希望根据雇员的薪水进行比较。
我们使用泛型Comparable接口举例,泛型接口的好处是不需要对Object类型参数进行强制转换。

首先实现Comparable并定义compareTo方法,按薪水进行比较

public class Employee implements Comparable<Employee>{
    private Double salary;
    private String name;

    public Employee(Double salary) {
        this.salary = salar y;
    }
    @Override
    public int compareTo(Employee other) {
        return Double.compare(this.getSalary(),other.getSalary());
    }
    //.....省略
}

然后进行测试,输出排序后数组中对象的薪水

    public static void main(String[] args) {
        Employee[] staff = new Employee[3];

        staff[0] = new Employee(3000.0);
        staff[1] = new Employee(2000.0);
        staff[2] = new Employee(4000.0);
        //排序
        Arrays.sort(staff);
        //输出薪水
        for(Employee e : staff){
            System.out.println(e.getSalary());
        }

    }

排序后的输出结果为

在这里插入图片描述

Comparator接口(compare)

问题

在这里插入图片描述
要处理这种情况,ArrayS.Sort 方法还有第二个版本, 有一个数组和一个比较器 ( comparator )作为参数, 比较器是实现了 Comparator 接口的类的实例。

Comparator接口

在这里插入图片描述

要按长度比较字符串,可以如下定义一个实现 Comparator<> 的类

在这里插入图片描述

具体完成比较时,需要建立一个实例

在这里插入图片描述
将这个调用与 words[i].compareTo(words[j]) 做比较。这个 compare 方法要在比较器对象上调用,而不是在字符串本身上调用。

代码示例,按字符串长度排序

定义比较器类和compare方法,实现了Comparator泛型接口

public class StringLengthComparator implements Comparator<String> {
    @Override
    public int compare(String o1, String o2) {
        return o1.length()-o2.length();
    }
}

测试。按字符串长度排序,Arrays.sort第一个参数为字符串数组,第二个参数为比较器实例

    String[] strs = {"abcd","adfcsd","aa"};
    //按字符串长度排序,传入比较器对象
    Arrays.sort(strs,new StringLengthComparator());
    for (String item : strs){
        System.out.println(item);
    }

输出结果

在这里插入图片描述

代码示例,Employee 对象数组进行排序,实现方式2

修改之前使用Comparable接口的方法实现的对象数组排序,改用使用实现Comparator接口的比较器实现对象数组排序
这样Employee类不用实现Comparable接口也能实现对象数组的排序。

实现方式2,定义比较器类 EmployeeComparator 和 compare 方法,实现了Comparator泛型接口

public class EmployeeComparator implements Comparator<Employee> {
    @Override
    public int compare(Employee o1, Employee o2) {
        return Double.compare(o1.getSalary(),o2.getSalary());
    }
}

测试,Arrays.sort中传入对象数组,和比较器实例

    Employee[] employees = new Employee[3];
    employees[0] = new Employee(2000.0);
    employees[1] = new Employee(1000.0);
    employees[2] = new Employee(3000.0);
	//EmployeeComparator 为比较器
    Arrays.sort(employees,new EmployeeComparator());
    for(Employee e : employees){
        System.out.println(e.getSalary());
    }

输出结果

在这里插入图片描述

Comparator与Comparable接口的不同

● 如果实现Comparable接口则是在 需要比较的对象上调用 compareTo方法
● 如果实现Comparator接口则是 使用在比较器实例调用 compare方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/898152.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-TensorFlow - 单词嵌入

Word embedding是从离散对象(如单词)映射到向量和实数的概念&#xff0c;可将离散的输入对象有效地转换为有用的向量。 Word embedding的输入如下所示: blue: (0.01359, 0.00075997, 0.24608, ..., -0.2524, 1.0048, 0.06259) blues: (0.01396, 0.11887, -0.48963, ..., 0.03…

解决Pycharm的Settings中Project不见了也无法选择Python Interpreter的方法

目录 一、问题如下二、解决方法 一、问题如下 突然打开项目没有python解释器&#xff0c;也无法重新配置python Interpreter&#xff0c;而且整个文件夹是黄色高亮的形式&#xff0c;如下显示&#xff0c;而且重新安装了pycharm也没用甚至说打开File–>Setting–>Projec…

网络编程套接字(1)

文章目录 网络编程套接字(1)1. 预备知识1.1 源IP与目的IP1.2 认识端口号1.3 理解 "端口号" 和 "进程ID"1.4 源端口号和目的端口号1.5 认识TCP协议和UDP协议(1) TCP(2) UDP 1.6 网络字节序 2. socket编程接口2.1 socket 常见API2.2 sockaddr结构 网络编程套…

深度学习环境搭建 cuda、模型量化bitsandbytes安装教程 windows、linux

cuda、cudann、conda安装教程 输入以下命令&#xff0c;查看 GPU 支持的最高 CUDA 版本。 nvidia-smi cuda安装&#xff08;cudatoolkit&#xff09; 前往 Nvidia 的 CUDA 官网&#xff1a;CUDA Toolkit Archive | NVIDIA Developer CUDA Toolkit 11.8 Downloads | NVIDIA …

react之路由的安装与使用

一、路由安装 路由官网2021.11月初&#xff0c;react-router 更新到 v6 版本。使用最广泛的 v5 版本的使用 npm i react-router-dom5.3.0二、路由使用 2.1 路由的简单使用 第一步 在根目录下 创建 views 文件夹 ,用于放置路由页面 films.js示例代码 export default functio…

IDM最新版2023不限速下载网盘详细操作教程

开启这个开关&#xff0c;让你的浏览器下载速度翻倍!大家有没有听说过IDM下载器&#xff0c;那是因为它的多线程下载功能&#xff0c;所以下载速度快&#xff0c;其实我们的浏览器也有多线程下载功能&#xff0c;只是默认关闭了而已&#xff0c;只需开启它&#xff0c;就可以有…

商城-学习整理-高级-性能压测缓存问题(十一)

目录 一、基本介绍1、性能指标2、JMeter1、JMeter 安装2、JMeter 压测示例1、添加线程组2、添加 HTTP 请求3、添加监听器4、启动压测&查看分析结果 3、JMeter Address Already in use 错误解决 二、性能监控1、jvm 内存模型2、堆3、jconsole 与 jvisualvm1、jvisualvm 能干…

sd-webui安装comfyui扩展

文章目录 导读ComfyUI 环境安装1. 安装相关组件2. 启动sd-webui3. 访问sd-webui 错误信息以及解决办法 导读 这篇文章主要给大家介绍如何在sd-webui中来安装ComfyUI插件 ComfyUI ComfyUI是一个基于节点流程式的stable diffusion的绘图工具&#xff0c;它集成了stable diffus…

第8章:集成学习

个体与集成 同质&#xff1a;相同的基学习器&#xff0c;实现容易&#xff0c;但是很难保证差异性。异质&#xff1a;不同的基学习器&#xff0c;实现复杂&#xff0c;不同模型之间本来就存在差异性&#xff0c;但是很难直接比较不同模型的输出&#xff0c;需要复杂的配准方法。…

【PACS源码】认识PACS的架构和工作流程

&#xff08;一&#xff09;PACS系统的组成及架构 PACS系统的基本组成部分包括&#xff1a;数字影像采集、通讯和网络、医学影像存储、医学影像管理、各类工作站五个部分。 而目前PACS系统的软件架构选型上看&#xff0c;主要有C/S和B/S两种形式。 C/S架构&#xff0c;即Client…

iMazing2.17.3免费版苹果传输电脑端文件数据工具

苹果手机在日常使用过程中可能会遇到iPhone内存不足的情况&#xff0c;遇到这种情况很多用户会选择删除照片来节省存储空间&#xff0c;大量删除照片可能会误删重要照片。另外iPhone可能会遇到自动重启、黑屏等故障。手机突然损坏&#xff0c;数据无法导出&#xff0c;此时备份…

判断链表中是否有环

如下图&#xff0c;如何判断链表中存在环路呢&#xff1f; 一种简单的方法描述&#xff1a; 设置两个链表指针p1和p2并指向链表&#xff0c;设置两个记录指针移动次数的变量c1和c2。在循环中&#xff0c;p1每次移动2个位置&#xff0c;c1加2&#xff1b;p1每次移动一个位置&am…

Redis高可用:哨兵机制(Redis Sentinel)详解

目录 1.什么是哨兵机制&#xff08;Redis Sentinel&#xff09; 2.哨兵机制基本流程 3.哨兵获取主从服务器信息 4.多个哨兵进行通信 5.主观下线和客观下线 6.哨兵集群的选举 7.新主库的选出 8.故障的转移 9.基于pub/sub机制的客户端事件通知 1.什么是哨兵机制&#xf…

被信息爆炸反噬了,自食恶果

我前两年回答的一个问题&#xff0c;最近频频收到点赞的消息提醒。 然后&#xff0c;我又思考了一下&#xff0c;我感觉信息价值危机随着生成式 AI 的诞生&#xff0c;可能会越来越严重。 什么问题呢&#xff1f; 有人提问&#xff1a; 现在中文互联网能搜索到的有价值信息越来…

【Android】设置-显示-屏保-启用时机-去除插入基座相关(不支持该功能的话)

设置-显示-屏保-启用时机-去除插入基座相关&#xff08;不支持该功能的话&#xff09; 1-项目场景&#xff1a;2-问题描述3-解决方案&#xff1a;4-代码修改前后效果对比图&#xff1a;代码修改前&#xff1a;代码修改后&#xff1a; 1-项目场景&#xff1a; 展锐平台 2-问题描…

C语言中常见的一些语法概念和功能

常用代码&#xff1a; 程序入口&#xff1a;int main() 函数用于定义程序的入口点。 输出&#xff1a;使用 printf() 函数可以在控制台打印输出。 输入&#xff1a;使用 scanf() 函数可以接收用户的输入。 条件判断&#xff1a;使用 if-else 语句可以根据条件执行不同的代码…

服装定制小程序

如今&#xff0c;人们对时尚的追求已不仅仅停留在传统的购买与穿搭上&#xff0c;而是更加注重个性化和定制化的需求。为满足这一需求&#xff0c;乔拓云网推出了一款创新的服装定制小程序&#xff0c;为用户提供定制专属时尚的全新旅途。 通过进入【乔拓云】后台&#xff0c;用…

大数据平台运维实训室建设方案

一、概况 本实训室的主要目的是培养大数据平台运维项目的实践能力,以数据计算、分析、挖掘和可视化的案例训练为辅助。同时,实训室也承担相关考评员与讲师培训考试、学生认证培训考试、社会人员认证培训考试、大数据技能大赛训练、大数据专业课程改革等多项任务。 实训室旨在培…

《游戏编程模式》学习笔记(五)原型模式 Prototype Pattern

原型的定义 用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。 举个例子 假设我现在要做一款游戏&#xff0c;这个游戏里有许多不同种类的怪物&#xff0c;鬼魂&#xff0c;恶魔和巫师。这些怪物通过“生产者”进入这片区域&#xff0c;每种敌人…

C++11并发与多线程笔记(9) async、future、packaged_task、promise

C11并发与多线程笔记&#xff08;9&#xff09; async、future、packaged_task、promise 1、std::async、std::future创建后台任务并返回值2、std::packaged_task&#xff1a;打包任务&#xff0c;把任务包装起来3、std::promise3、小结 1、std::async、std::future创建后台任务…