Comparable与Comparator对比

Java Comparable 与 Comparator 的深度对比 / 姓名比较器@Override// 年龄倒序比较器@Override// 使用// 按姓名排序// 按年龄降序。 阅读详情

本文参考链接:https://blog.youkuaiyun.com/u010859650/article/details/85009595

1.介绍

1.1.Comparable(排序接口)

Comparable 是排序接口,内部有唯一实现方法:int compareTo(T o)。

public interface Comparable<T> {
	public int compareTo(T o);
}

若一个类实现了Comparable接口,就意味着“该类支持排序”。
通过x.compareTo(y)来比较x和y的大小:

x < y  => 负数
x == y => 零
x > y  => 正数

1.2.Comparator(比较器接口)

Comparator 是比较器接口。我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。
int compare(T o1, T o2) 和上面的x.compareTo(y)类似。

public interface Comparator<T> {
    int compare(T o1, T o2);
}

Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

2.示例

定义类House

public class House implements Comparable<House> {
    protected double proportion;  // 房子面积
    protected double price;		  // 房子单价
	// 构造函数
    public House(double proportion, double price) {
        this.proportion = proportion;
        this.price = price;
    }
	/**
	 * 重写compareTo方法, 利用房子的面积来进行大小比较
	 **/
	@Override
    public int compareTo(House o) {
        if (this.proportion > o.proportion) { // 大于返回正数
        	return 1;
        } else if (this.proportion < o.proportion) { // 小于返回负数
        	return -1;
        }
        return 0; // 相等返回0
    }

    @Override
    public String toString() {
        return "面积为" + proportion + "\t价格为" + price;
    }
}

List<House> houses = new ArrayList();
House h1 = new House(95.0, 12000);
House h2 = new House(110.0, 12160);
House h3 = new House(80.0, 16300);
House h4 = new House(150.3, 10690);
houses.add(h1);
houses.add(h2);
houses.add(h3);
houses.add(h4);

2.1.调用实现Comparable的类

// 示例:可利用Collections来调用
Collections.sort(houses);

2.2.调用Comparator的比较方法

// 首先定义比较器
/**
 * 实现Compatator接口, 并重写compare方法, 根据单价倒序排序
 **/
static class ComparatorPrice implements Comparator<House> {
    @Override
    public int compare(House o1, House o2) {
        // 下述对比code可简化为
        // return Integer.compare(o2.price, o1.price);
        if (o1.price < o2.price) {
        	return 1;
        } else if (o1.price > o2.price) {
            return -1;
        }
        return 0;
    }
}

// 利用Collections调用比较器
Collections.sort(houses, new ComparatorPrice());

// 匿名类写法
Collections.sort(houses, new Comparator<House> {
	public int compare(House o1, House o2) {
		return Integer.compare(o2.price, o1.price);
	}
});

// lambda表达式写法
Collections.sort(houses, (h1, h2) -> Integer.compare(h2.price, h1.price));

使用Comparator.comparing比较的方法参见链接:https://my.oschina.net/xinxingegeya/blog/2046405

2.3.Collection与Collections的区别

Collection是集合类的上级接口,继承与他有关的接口主要有List和Set
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全等操作。

public static void main(String args[]) {   
       List list = new ArrayList(); // List是实现Collection接口
       double array[] = {112, 111, 23, 456, 231};   
       for (int i = 0; i < array.length; i++) {   
           list.add(new Double(array[i]));   
       }   
       Collections.sort(list);   //把list按从小到大排序
       for (int i = 0; i < array.length; i++) {   
           System.out.println(list.get(i));   
       }   
       // 结果:23.0 111.0 112.0 231.0 456.0   
 }   

集合框架中,Collections工具类支持两种排序方法:

Collections.sort(List<T> list); 
Collections.sort(List<T> list, Comparator<? super T> c); // note: 第2个参数支持lambda表达式

如果待排序的列表中是数字或者字符,可以直接使用Collections.sort(list);
当需要排序的集合或数组不是单纯的数字型时,需要自己定义排序规则,实现一个Comparator比较器。
Collections调用Collections.sort(list)方法,方法传递一个List集合,这里要求,List泛型里面装的元素必须实现Comparable接口此外,列表中的所有元素都必须是可相互比较的(也就是说,对于列表中的任何 e1 和 e2 元素,e1.compareTo(e2) 不得抛出 ClassCastException)。

医学影像处理实战:如何用Python+SimpleITK搞定DICOM/NIfTI重采样(附完整代码) 本文详细介绍了如何使用Python和SimpleITK库实现医学影像(DICOM/NIfTI格式)的智能重采样技术。通过实战代码演示,帮助读者掌握医学图像处理中的关键步骤,包括环境搭建、数据准备、核心算法实现和质量验证,解决医学AI领域中的影像标准化难题。 阅读详情

相关推荐

DCDC系列(一): COT DCDC基本原理

电流环DCDC属于双环控制模式,根据电流检测的位置,分为峰值电流环控制模式、谷值电流环控制模式和平均电流环控制模式,主要由输出电压反馈环和电流环两个环路来实现控制,其瞬态响应比电压环更好,且有自动限流的功能,但仍需要斜坡补偿网络,且对噪声敏感。Stage3: 在下管NMOS打开阶段,由于后级负载此时间段内消耗的电量较少,所以VFB还未低至Vref,所以此阶段中,上管PMOS和下管NMOS均处于关断状态,此时的电感电流为0mA,此阶段测的VSW上的电压就是Cout上的电压VREG;

weixin_40073649的博客 3938

Java中的Comparable接口与Comparator接口

Comparable接口与Comparator接口详解

m0_62909831的博客 2346

T100服务端接口实战:从注册到日志排查的全链路开发指南

本文提供了一份T100服务端接口开发的全链路实战指南。从程序注册与框架签出开始,详细讲解了接口的数据结构设计、核心业务逻辑编写,到最终的部署上线与调用验证。文章重点分享了如何利用日志文件高效定位和排查接口问题,帮助开发者快速掌握T100接口开发的关键步骤与实用技巧。

weixin_28831399的博客 297

关于compare的线程安全问题

很明显,你这是在操作两个字段 a 和 b,有线程安全问题,应该为 add 方法加上锁,确保 a 和 b 的 ++ 是原子性的,就不会错乱了。在一个类里有两个 int 类型的字段 a 和 b,有一个 add 方法循环 1 万次对 a 和 b 进行 ++ 操作,有另一个 compare 方法,同样循环 1 万次判断 a 是否小于 b,条件成立就打印 a 和 b 的值,并判断 a>b 是否成立。按道理,a 和 b 同样进行累加操作,应该始终相等,compare 中的第一次判断应该始终不会成立,不会输出任何日志。

xiaoshitou_2015的博客 495

Windows10 使用Apple Studio Display显示器的设置

AppleStudioDisplay显示器购买花了近1.5wRMB,由于为windows台式机,显卡为NVIDAGTX-1660,而AppleStudioDisplay只有雷电接口,尝试了很多种转接方式,均以失败告终,最终使用贝尔金VR线成功,,附图如下这边也测试过NVIDARTX-2060Super、NVIDAGTX-1650显卡,都是能点亮的,NVIDA1650存在关机重启后黑屏,不稳定现象,2060也存在关机重启后不亮现象,后面发现1660s很稳定。...

爱意随风起,人生不可弃。 1万+

别再手动算临界转速了!用ANSYS Workbench 2023 R2快速搞定转子坎贝尔图(附完整APDL命令流)

本文详细介绍了如何利用ANSYS Workbench 2023 R2快速生成转子坎贝尔图,实现全自动临界转速分析。通过对比传统手动计算与Workbench自动化流程的效率差异,展示了其在旋转机械设计中的革命性优势,包括大幅缩短分析周期、提升精度至98.7%。文章还提供了完整的APDL命令流和实战案例,帮助工程师快速掌握这一高效工具。

weixin_42699679的博客 470

【Java】深入理解Comparable和Comparator对象排序

对于不清楚如何排序的对象,需要该对象的类使用Comparable接口来指定排序的方法(如果该类不实现Comparable接口,也可以指定一个Comparator进行排序,这点一会说)。String类的Comparable接口使用了泛型,通过查看Comparable接口的源码可以看到,这里的泛型规定了Object类的具体子类,一般传入实现该接口的类即可,比如Student类,泛型传入Student。TimSort是对归并排序做了大量优化的新版本,所以程序会跳转到TimSort.sort方法中,完成对象排序。

gaowencheng01的博客 6314

oh-my-zsh详细安装与主题插件配置

使用Linux的小伙伴都知道默认shell是bash,但是对于喜欢折腾,喜欢酷炫的我们bash怎能够用。zsh的作为一种shell,功能更强大,但是配置复杂。后来,有大佬创建了一个名为oh-my-zsh的开源项目,使用方便,功能强大。 下面就去oh-my-zsh的配置。 ①安装zsh 想要安装oh-my-zsh,首先得安装zsh,输入命令 sudo apt-get install zsh 界面如下 ②查看是否安装成功 输入命令 zsh --version 可以查看安装zsh的版本..

惜洛-Jankin的博客 2万+

Java基础汇总(十五)——Iterator,Comparable和Comparator

Java基础汇总 iterator;迭代器 comparable comparator;比较器

weixin_45864705的博客 599

荒岛逃生游戏

正负表示逃生方向(正表示向右逃生,负表示向左逃生),绝对值表示战斗力,越左边的数字表示里左边港口越近,逃生方向相同的人永远不会发生决斗。- 如果左逃生者的战斗力大于右逃生者,则左逃生者获胜,减少其战斗力,并将右逃生者出栈。- 处理完所有输入后,统计仍在右逃生者栈和左逃生者栈中的战斗力,即可得到成功逃生的人数。- 如果左逃生者的战斗力小于右逃生者,则右逃生者获胜,减少其战斗力,左逃生者出局。- 向左逃生:从右逃生者栈中取出元素,与当前逃生者进行决斗。- 继续进行决斗,直到没有右逃生者或左逃生者的战斗力用尽。

面试高手的博客 2101

游戏引擎揭秘:大厂为何死磕自研?

游戏引擎本质与商业价值解析 游戏引擎是集成了渲染、物理、动画等核心功能的开发工具包,其价值在于让开发者免于重复编写底层代码,专注于游戏内容创作。商业引擎(如Unity/Unreal)虽降低了开发门槛,但头部厂商仍坚持自研引擎,主要基于以下考量: 经济性:长期项目分摊自研成本后,比商业引擎分成更划算; 可控性:完全掌握底层代码,能针对性优化核心玩法需求; 技术壁垒:专属引擎成为厂商的竞争优势,如米哈游的跨平台渲染技术; 项目适配:超大型游戏(开放世界/MMO)需要深度定制解决方案。 这种"短期高投入

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 263

Java 集合用法总结

Java 集合 一、集合与数组的区别 相同点: 都是用来存储数据的。 不同点: 1.集合带array的底层由数组实现,还有一部分由其他方式(树、链表等)实现。 2.数组大小固定,而集合没有固定的大小,更方便存储。 3.数组只能放一种类型,集合不考虑泛型可以存多种类型。 4.集合放基本类型是通过装箱拆箱(包装类与基本数据类型的转换)来实现的。(泛形的时候不能用int,而要用Integer) 二、集合...

秒怂_z 1003

uni-app - 在纯 JS 文件中调用自定义弹框组件 / 封装全局 API 调用弹框组件(解决小程序、APP 无法使用 document.body.appendChild 插入组件节点)适配全端

uni-app-在纯JS文件中调用自定义弹框组件/封装全局API调用弹框组件(解决小程序、APP无法使用document.body.appendChild插入组件节点)适配全端,uni-appappendChild怎么向小程序中插入节点,如何开发类似uni.showModal全局组件。h5端可以通过document.body.appendChild挂载,请问app跟微信小程序怎么弄,请问uniapp如何封装全局api调用弹窗组件?uniapp怎么设置所有页面共用的组件Uni

🏆 前端领域优质创作者 1万+

Java的Comparator和Comparable对比

1.对象如何对比排序? Java的基本类型如int, float, double都可以直接使用java.util.Arrays.sort(Object[])对比排序,那对象是如何比较排序的呢?我们定义的类都是继承Object类的,Object类的equals的方法,默认是比较两个对象是否相等(hashcode相同) public boolean equals(Object obj) {

cfanr 1704

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java中Comparable和Comparator对比

待完善

风中一匹狼的博客 376

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java中Comparable与Comparator接口深度对比:排序艺术完全指南(附实战避坑指南)

要修改源码 → Comparable多种排序方式 → Comparator第三方库类 → 必须用Comparator性能敏感 → 两者差异不大框架开发 → 优先考虑Comparator扩展性“好的比较器,能让代码自己说话!掌握这两个接口,从此排序问题不再是拦路虎,而是展现编程功力的舞台!

StackOverthink的博客 1106

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Comparable接口与Comparator接口对比以及应用说明

1.使用说明 comparetor接口(外部排序接口):新建类Student以及实现接口的StudentComparator,重写compare方法,比较顺序是先按照age降序,然后id升序,对于compare写法与排序关系,详见附图,数据量比较少时为典型升序冒泡排序算法。 package com.hbtx; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util

weixin_42350973的博客 383

Comparable 和 Comparator 的对比

对Comparable 的解释 Comparable是一个排序接口,此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法 public int compareTo(T o); 自定定类实现 Comparable 时,重写 compareTo 方法 1.当返回值的是自身减去参数(即this - o)是正序排序,从 小到大 2.当返回值的是参数减去自身(即o - this )则是逆序排序,从大到小 compareTo方法接受任意类型

永无止境 209

java 中两种对比方式(Comparable 和 Comparator)使用区别及优缺点对比

在 Java 中,Comparable和Comparator都用于对对象进行排序,但它们的使用方式和适用场景有所不同。下面是它们的区别、优缺点以及用表格进行对比整理。

爱的叹息的专栏 718

Comparator和Comparable对比和实例分析

Comparator是一个比较器定义了一种比较的规则,某个类使用Collections和Arrays的sort方法时传入某个对象的集合和自定义的比较器即可获得相应排序之后的序列。需要自定义compare方法 Comparable直接运用到某个类上,如果某个类实现了该接口的时,这个类就是可以比较的。需要自定义compareto方法 Comparator强调的是将比较的和数据类分离。 Compa

华love邵的博客 421

Comparable和Comparator的对比

1. 前言 经常可以看到这2个类,但是很容易弄混淆,今天写篇博客记录下。 环境:JDK1.8 2. 正文 相同: 2者都是接口,都可以实现排序 比较的字符定义为source,待比较的定义为target,那会有如下关系 source &gt; target return 正数 source = target return 0 source &lt; target return 负数 不同点...

不积跬步无以至千里 319

通过一个demo来对比Comparator和Comparable

文章目录 package edu.princeton.cs.JavaClassAndInterface; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; public class AboutComparator { public static void mai...

richard1230的博客 272

Comparable与Comparator排序对比

Comparable 接口,一般是采取实现类接口compareTo方法的方式来达到内部排序的目的。也就这一个方法,一般也叫做自然排序,也就是实现了就只能按照这个排序规则,不能随意更改排序规则。 例子: public class Book implements Comparable<Object> { // 定义名为Book的类,默认继承自Object类 public int id;// 编号 public int compareTo(Ob

笔记小屋 361

Java对象深度对比:equals、Comparable、Comparator详解 & PriorityQueue实战

底层是堆结构,入队时需要不断比较元素维护堆有序。如果存入没有比较能力的自定义类,运行时抛出。// 报错代码解决核心:给自定义对象提供大小比较规则,Java提供三套方案。侵入式接口:自定义类直接实现接口,重写方法,定义对象默认比较规则。// 返回 <0 :this < o// 返回 =0 :this == o// 返回 >0 :this > o非侵入式,不需要修改原有实体类,单独新建比较器类,重写方法。// 返回 <0:o1 < o2// 返回 =0:o1 == o2。

2501_93786094的博客 323

Comparable和Comparator区别(超详细对比分析)

Comparable和Comparator接口都是实现集合中元素的比较、排序的,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较逻辑。可以把Comparable理解为内部比较器,而Comparator是外部比较器。 一、Comparable java.lang包中 Comparable 是一个对象本身就已经支持自比较所需要实现的接口,如String、Integer自己就实现了Comparable接口,可完成比较大小操作。自定

qq_45559536的博客 1万+

java对比_Java 中 Comparable 和 Comparator 比较

本文,先介绍Comparable 和Comparator两个接口,以及它们的差异;接着,通过示例,对它们的使用方法进行说明。Comparable 简介Comparable 是排序接口。若一个类实现了Comparable接口,就意味着“该类支持排序”。即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组...

weixin_29182481的博客 94
上一篇: 【JAVA】java中split以“.“ 、“\“、“|”分隔字符串
下一篇: 【马拉车算法/动态规划】最长回文字串
Allenlzcoder
博客等级 码龄10年 925粉丝 512原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值