【Java】Java对象的比较

news2024/11/15 13:21:24

Java对象的比较

  • PriorityQueue中插入对象
  • 元素的比较
    • 基本数据类型的比较
    • 对象的比较
      • 重写基类的equals方法
      • 基于Comparble接口类的比较
      • 基于比较器进行比较

PriorityQueue中插入对象

优先级队列在插入元素时有个要求:插入的元素不能是null或者元素之间必须要能够进行比较,为了简单起见,我们只是插入了Integer类型,那优先级队列中能否插入自定义类型对象呢?

/**
 * Card:扑克牌类
 * rank:数值
 * card:花色
 */
class Card{
    public int rank;
    public String suit;

    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }
}
public class test {
    public static void main(String[] args) {
        PriorityQueue<Card> cards = new PriorityQueue<>();
        Card c1 = new Card(9,"♣");
        Card c2 = new Card(7,"♦");
        cards.offer(c1);
        cards.offer(c2);
    }
}

我们定义了一个扑克牌类 用一个优先级队列来储存扑克牌类的对象 当我们创建了两个扑克牌对象 然后把两张扑克牌放入优先级队列中

此时我们运行程序
在这里插入图片描述
发现程序出现异常

原因就是 在构建优先级队列时 入队的元素都要进行比较 而我们传入的是一个自定义类型 程序并不知道我们要根据什么来比较类的大小 所以在这里出现了异常

元素的比较

基本数据类型的比较

在Java中,基本类型的对象可以直接比较大小。

对象的比较

有些情况下,需要比较的是对象中的内容,比如:向优先级队列中插入某个对象时,需要对按照对象中内容来调整堆,那该如何处理呢?

重写基类的equals方法

class Card{
    public int rank;
    public String suit;

    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }

    public boolean equals(Object o){
        //自己和自己比较
        if(this == o){
            return true;
        }

        //o如果是null对象或者o不是Card的子类
        if(o == null || !(o instanceof Card)){
            return false;
        }
        Card c = (Card)o;
        return rank == c.rank && suit.equals(c.suit);
    }
}

注意: 一般覆写 equals 的套路就是上面演示的

  1. 如果指向同一个对象,返回 true
  2. 如果传入的为 null,返回 false
  3. 如果传入的对象类型不是 Card,返回 false
  4. 按照类的实现目标完成比较,例如这里只要花色和数值一样,就认为是相同的牌
  5. 注意下调用其他引用类型的比较也需要 equals,例如这里的 suit 的比较
    覆写基类equal的方式虽然可以比较,但缺陷是:equal只能按照相等进行比较,不能按照大于、小于的方式进行比较。

即只能比较是否相同 不能比较谁大谁小

基于Comparble接口类的比较

Comparble是JDK提供的泛型的比较接口类,源码实现具体如下:

public interface Comparable<E> {
	// 返回值:
	// < 0: 表示 this 指向的对象小于 o 指向的对象
	// == 0: 表示 this 指向的对象等于 o 指向的对象
	// > 0: 表示 this 指向的对象大于 o 指向的对象
	int compareTo(E o);
}

对用用户自定义类型,如果要想按照大小与方式进行比较时:在定义类时,实现Comparble接口即可,然后在类中重写compareTo方法。

class Card implements Comparable<Card>{
    public int rank;
    public String suit;


    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }

    // 根据数值比较,不管花色
    // 这里我们认为 null 是最小的
    @Override
    public int compareTo(Card o) {
        if(o == null){
            return 1;
        }
        return rank - o.rank;
    }
    
}
public class test {
    public static void main(String[] args) {
        PriorityQueue<Card> cards = new PriorityQueue<>();
        Card c1 = new Card(9,"♣");
        Card c2 = new Card(7,"♦");
        System.out.println(c1.compareTo(c2));
    }
}

在这里插入图片描述
我们可以看到程序的返回结果是 2 也就是两张牌的差值 这样就可以判断出两张牌的大小关系

基于比较器进行比较

按照比较器方式进行比较,具体步骤如下:

用户自定义比较器类,实现Comparator接口
覆写Comparator中的compare方法

class CardComparator implements Comparator<Card>{
    @Override
    public int compare(Card o1, Card o2) {
        return o1.rank - o2.rank;
    }
}
/**
 * Card:扑克牌类
 * rank:数值
 * card:花色
 */
class Card {
    public int rank;
    public String suit;

    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }


}
public class test {
    public static void main(String[] args) {
        PriorityQueue<Card> cards = new PriorityQueue<>();
        Card c1 = new Card(9,"♣");
        Card c2 = new Card(7,"♦");
        CardComparator comparator = new CardComparator();
        System.out.println(comparator.compare(c1,c2));
    }
}

在这里插入图片描述
这种方法好在不需要在类本身中修改比较的方法 类只需要实现接口 就可以完成比较

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

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

相关文章

Redis持久化之AOF日志高频问题

1、如何采用AOF日志避免宕机丢失数据&#xff1f; Redis 的持久化主要有两大机制&#xff0c;即 AOF&#xff08;Append Only File&#xff09;日志和 RDB 快照。 MySQL数据库的写前日志&#xff08;Write Ahead Log, WAL&#xff09;&#xff0c;在实际写数据前&#xff0c;…

PWLCM分段线性混沌映射

混沌映射是生成混沌序列的一种方法,常见的混沌映射方式有 Logistic映射、Tent映射、Lorenz映射,而PWLCM&#xff08;Piecewise Linear Chaotic Map&#xff0c;分段线性混沌映射&#xff09;作为混沌映射的典型代表&#xff0c;数学形式简单&#xff0c;具有遍历性和随机性。其…

智能优化算法:基于减法平均的优化算法-附代码

智能优化算法&#xff1a;基于减法平均的优化算法 文章目录 智能优化算法&#xff1a;基于减法平均的优化算法1.基于减法平均优化算法1.1 初始化1.2 SABO的数学建模 2.实验结果3.参考文献4.Matlab 摘要&#xff1a;基于减法平均的优化算法&#xff08;Subtraction-Average-Base…

[数据结构] 二叉搜索树的详解实现

文章目录 概念实现架构BSTreeNodea&#xff08;节点&#xff09;BSTree框架 增删查 -- 循环写法insert&#xff08;尾插&#xff09;inOrder&#xff08;遍历&#xff09;Find&#xff08;查找&#xff09;Erase&#xff08;删除&#xff09;默认成员函数构造拷贝构造析构函数赋…

哈夫曼编码文件压缩和解压

哈夫曼编码&文件压缩和解压 文章目录 哈夫曼编码&文件压缩和解压哈夫曼编码基本介绍原理解析代码实现 文件的压缩文件的解压完整代码 哈夫曼编码 基本介绍 赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding)&#xff0c;又称霍夫曼编码&#xff0c;是一种编码方式, 属于…

实现c++轻量级别websocket协议客户端

1 websocket 轻量客户端 因以前发过这个代码&#xff0c;但是一直没有整理&#xff0c;这次整理了一下&#xff0c;持续修改&#xff0c;主要是要使用在arm的linux上&#xff0c;发送接收的数据压缩成图片发送出去。 要达到轻量websocket 使用&#xff0c;必须要达到几个方面…

MySQL:数学函数和字符串函数

目录 前言&#xff1a; 数学函数&#xff1a; 求绝对值&#xff1a; 求PI&#xff1a; 求平方根&#xff1a; 求余数&#xff1a; 取整&#xff1a; 随机数&#xff1a; 四舍五入&#xff1a; 只舍不入&#xff1a; 返回参数符号&#xff1a; 幂运算&#xff1a; …

Illustrator如何编辑图形对象之实例演示?

文章目录 0.引言1.绘制海浪插画2.绘制时尚波浪发型3.绘制一条鲸鱼 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对Illustrator进行了学习&#xff0c;本文通过《Illustrator CC2018基础与实战》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对图形…

快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM

快速上手Pytorch实现BERT&#xff0c;以及BERT后接CNN/LSTM 本项目采用HuggingFace提供的工具实现BERT模型案例&#xff0c;并在BERT后接CNN、LSTM等 HuggingFace官网 一、实现BERT&#xff08;后接线性层&#xff09; 1.引用案例源码&#xff1a; from transformers impo…

开关电源基础01:电源变换器基础(2)

说在开头&#xff1a;关于德布罗意的电子波&#xff08;3&#xff09; 1923年&#xff0c;德布罗意在求出他的相波之前&#xff0c;康普顿刚好用光子说解释了康普顿效应&#xff08;记性好的胖友们应该还记得&#xff1a;散射波的波长变长问题&#xff09;&#xff0c;从而带领…

开关电源基础02:基本开关电源拓扑(2)-BOOST-BUCKBOOST拓扑

说在开头&#xff1a;关于海森堡的矩阵&#xff08;2&#xff09; 海森堡写完论文就回到了哥廷根大学&#xff0c;他一看见玻恩就把这份论文拿出来请老师把关&#xff0c;还说要趁着假期去趟英国剑桥大学讲课交流。玻恩拿过论文一看&#xff0c;海森堡画的这个表格是啥玩意啊&…

【操作系统】高性能网络模式:Reactor 和 Proactor

【操作系统】高性能网络模式&#xff1a;Reactor 和 Proactor 参考资料&#xff1a; 高性能 RPC 通信的实现- 巧用 reactor 模式 高性能网络模式&#xff1a;Reactor 和 Proactor NIO Reactor模型 Netty「基石」之Reactor模式 高性能IO模型分析-Reactor模式和Proactor模式 【…

【服务器】无公网IP,异地远程连接威联通NAS

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 前言 1. 威联通安装cpolar内网穿透 2. 内网穿透 2.1 创建隧道 2.2 测试公网远程访问 3. 配置固定二级子域名 3.1 保留二级子域名 3.2 配置二级子域名 4. 使用固定二级子…

Linux诊断原因:生产环境服务器变慢,诊断思路和性能评估

Linux诊断原因&#xff0c;生产环境服务器变慢&#xff0c;诊断思路和性能评估 1 整机&#xff1a;top&#xff0c;查看整机系统性能 使用top命令的话&#xff0c;重点关注的是 %CPU、%MEM 、load average 三个指标 load average三个指标&#xff1a;分别代表1、5、15时分钟系…

2022年NOC大赛编程马拉松赛道初赛图形化低年级A卷-正式卷,包含答案

目录 选择题: 下载文档打印做题: 2022年NOC大赛编程马拉松赛道【初赛】图形化低年级A卷-正式卷 2022NOC-图形化初赛低年级A卷正式卷 选择题: 1、答案:B 禾木是一个军事迷,他打算利用业余时间制作一款射击游戏。在游戏中,玩家可以通过鼠标控制手枪移动。请问,给手枪…

springboot+vue体质测试数据分析及可视化设计(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的体质测试数据分析及可视化设计。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&a…

[svg-icon]引入vue项目后,use标签为0,已解决

这个bug我之前遇到过一次&#xff0c;解决了也就没记录 但是好记性不如烂笔头&#xff0c;这次重新遇到&#xff0c;又重新排查bug花了1个多小时 svg引入vue项目&#xff0c;需要依赖svg-sprite-loader npm install svg-sprite-loader在vue.config.js中 chainWebpack(conf…

NOC大赛·核桃编程马拉松赛道知识点大纲(高年级及初中组)

NOC核桃编程马拉松知识点大纲(高年级及初中组) (一)基础语法 1.掌握运动积木的用法。 包括“移动 10 步”、“左/右转 X 度”、“面向 X 方向/鼠标指针/ 角色”、“移到 XY 坐标/鼠标/角色”、“X/Y 坐标的设定和增加”、 “滑行到 XY/鼠标/角色”等积木用法,详细如下。 1…

【数据结构】链表OJ:力扣160. 相交链表

最近这几篇内容都有关链表&#xff0c;接下来几篇内容会分享一些链表的OJ题&#xff0c;希望对你有所帮助。 今天要分享的内容是力扣160. 相交链表&#xff1a;160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 目录 题目&#xff1a; 题解 题目&#xff1a; 给你…

数据分析02——numpy模块的在jupyter中的使用

0、numpy&#xff1a; 在计算机中会把数学当中的矩阵叫做数组&#xff0c;在很多应用中的表格也就是通过矩阵表示的&#xff0c;所以numpy广泛用于机器学习&#xff0c;数据分析&#xff0c;和图像处理领域。 1、numpy常用方法和函数&#xff1a; 前言&#xff1a;在使用nump…