【算法与数据结构】3 知行合一,线性查找的自定义类测试

news2025/1/18 14:45:42

请添加图片描述

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流

本文收录于算法与数据结构体系专栏,本专栏对于0基础者极为友好,欢迎与我一起完成算法与数据结构的从0到1的跨越

在这里插入图片描述

线性查找的测试应用

  • 1.前言
  • 2.使用自定义类测试
    • 2.1⛏创建Student类并测试
    • 2.2 🔎剖析测试结果
    • 2.3 自定义equals()
      • 2.3.1 初窥门径➡️错误的函数声明
      • 2.3.2 渐入佳境➡️善用工具
      • 2.3.3 略有小成 ➡️完成equals()
      • 2.3.4 融会贯通➡️完整的equals()

1.前言

☑️首篇详细讲述线性查找法并且对其进行了初步的优化:👉传送门:💖详解什么是算法?什么是线性查找法?💖

☑️第二篇进行了再次优化,讲述了使用泛型这种语言机制来解决避免重复写一个方法的问题:👉传送门:💖线性查找的究极优化💖

⬇️学习了前面的理论,我们应该学会举一反三:在对于不同的类而言,里面的equals()方法具体的实现逻辑可能不同,在第二篇中使用的是Integer作为例子,对于Java语言而言,已经帮助实现了Integer类的equals()方法,包括8个基本类型对应的包装类或者String类等通常使用的类,Java语言都已经帮我们实现了equals()方法
🔺当我们使用自己定义的类的时候,是需要自己去将equals()的逻辑实现出来的,那么一起来学习如何实现吧👇

2.使用自定义类测试

2.1⛏创建Student类并测试

  • 创建Student类
public class Student {        //Student类
    private String name;
    public Student(String name){
        this.name = name;
    }
}
  • 进行测试
public class LinearSearch {
    private LinearSearch(){}
    public static <E> int search(E[] data, E target){
        for(int i = 0; i < data.length; i ++)
            if(data[i].equals(target))
                return i;
        return -1;
    }
    public static void main(String[] args){    //进行测试
        Student[] students = {new Student("A"),
                              new Student("B"),
                              new Student("C")};
        Student b = new Student("B");
        int res3 = LinearSearch.search(students, b);
        System.out.println(res3);
    }
}
  • 测试结果
    在这里插入图片描述

2.2 🔎剖析测试结果

  • 🔵代码描述: students数组是一个Student类的数组,里面new了三个Student类的对象,分别为A、B、C,然后使用LinearSearch的search()方法——参数为数组students和b,即查找students中是否有名为"B"的学生
  • 🔴结果描述: 查询结果是-1,即不存在学生B,很明显,查询结果是有误的
  • 🟢结果剖析: 查询结果是-1,是因为 equals()方法默认比较的是两个类对象的地址,而在我们上面代码的逻辑中,我们 更希望的是比较两个类对象所对应的字符串 ——为了实现这个逻辑,我们就必须自己 自定义Student的这个类中的这个equals()

2.3 自定义equals()

2.3.1 初窥门径➡️错误的函数声明

public boolean equals(Student student){...}
  • 结论: equals(Student student):对equals的声明里传的参数和Student类的类型是一样的,这个函数声明是错误的❌
  • 原因: equals()是Object父类的一个函数,我们是 覆盖equals这个方法,所以这个 函数签名要和Object的函数签名是一样的——Object父类函数传进去的参数的类型是Object,我们需要这样来写⬇️
public boolean equals(Object student){...}

2.3.2 渐入佳境➡️善用工具

  • 1️⃣工具之编译器

    • 正确书写函数声明时, 编译器会左侧出现了一个标志, 表示了我们是override,是在覆盖一个方法
      在这里插入图片描述
    • 如果是equals(Student student),相当于自己定义了一个自己的equals,没有进行覆盖,并且编译器也不会有提示
  • 2️⃣工具之Java关键字

    • 可以在方法上使用关键字Override,这样如果在需要覆盖却没有覆盖的时候,编译器就会报错
      在这里插入图片描述
      在这里插入图片描述
    • ❓为什么会报错?因为无法找到与public boolean equals(Student student)的函数签名一样的equals(),编译器没有检查到我们是在覆盖一个方法。
    • ✅如果改成public boolean equals(Object student),编译器就会找到Student的一个父类,即Object类中有与其函数签名一样的equals(),则这个覆盖就是正确的

2.3.3 略有小成 ➡️完成equals()

  • 1️⃣声明
@Override
    public boolean equals(Object student){}
- 2️⃣因为student是Object类的对象,所以**将其强制转换为Student类的对象**
Student stu = (Student)student;
  • 3️⃣完成比较是否相等的逻辑,并将结果返回
    • 该判断仅针对本文中的判断逻辑,因为现实中同名不一定是同一个人
/*此处的equals()其实是调用的String类中的equals
➡️所以,将两个学生类的比较,变成了字符串的比较
如果两个学生的名字所对应的字符串是一样的,即两个学生是一样的
*/
return this.name.equals(stu.name);
  • 4️⃣整体逻辑如上⬆️,不过我们仍需要添加一些判断, 因为将Object类型的对象student 强制转换为Student类的对象,可能会抛异常或者无法强制转换
//【判断1】:this,即当前这个类的对象,是否就是Student类的对象,它们的地址是否一样
if(this == student)
 	/*
 	如果判断结果为一样,
 	那么比较的就是同一个对象,就不需要强制转换,true
 	*/
	return true;

//【判断2】:如果判断1是false,那么就判断传来的student是不是一个空对象
if(student == null)
	/*当前的Student类的对象肯定是非空的,如果传来的student是空对象,那么直接false*/
	return false;
	
//【判断3】:判断强制转换是否成立
	/*
	this.getClass()即当前这个类对象所对应的类到底是什么,其实就是Student类
	判断this.getClass是否等于传来的student这个对象所对应的类
	如果不相等,即二者不属于同一个类,直接false
	*/
if(this.getClass() != student.getClass())
	return false;

✔️经过4️⃣里的3个判断,如果都通过了,即传的student不为空,且确实是Student类的对象,那么就可以安全的进行强制转换的操作2️⃣

2.3.4 融会贯通➡️完整的equals()

public class Student {
    private String name;
    public Student(String name){
        this.name = name;
    }
    @Override
    public boolean equals(Object student){

        if(this == student)
            return true;

        if(student == null)
            return false;

        if(this.getClass() != student.getClass())
            return false;

        Student another = (Student)student;
        return this.name.equals(another.name);
    }
}
  • 使用2.1中的测试代码进行测试,得到了我们想要的结果,即成功找到了名为B的学生,在数组students中索引为1的位置,即students[1]
    在这里插入图片描述请添加图片描述

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

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

相关文章

记录一下verilog重复例化的两种方式

文章目录0 前言1 for循环方式例化方法2 数组的方式例化4 一些其他的技巧0 前言 这段时间例化了挺多mem&#xff0c;过程中也了解到了一些新的东西&#xff0c;在这里记录一下 1 for循环方式例化方法 先给出 sub_module module sub(input [7:0] din,output logic [7:0] dout…

手撕深度学习中的损失函数(上)

面试中经常会问到损失函数的相关问题&#xff0c;本文推导了深度学习中常用损失函数的计算公式和反向传播公式&#xff0c;并使用numpy实现。 定义损失函数基类&#xff1a; class Loss:def loss(self, predictions, targets):raise NotImplementedErrordef grad(self, predic…

SQL Server数据库-----基础知识

数据库基础数据类型 整数类型 int 范围 2的正负31次方 小数类型 decimal 范围 正负10的38次方&#xff0c;不包含两端的 固定长度的非Unicode字符 char 可变长度的非Unicode字符 varchar 如varchar(20)是最多可以有20个字符&#xff0c;-12-3 可变长度的Unicode字符 nvar…

xmind免费安装使用教程

一、简介 xmind 是一款功能强大的思维导图和脑图制作工具&#xff0c;它可以帮助用户将复杂的信息和想法以图形化的方式进行组织和展示&#xff0c;使得思维更加清晰和有条理。xmind 是一款跨平台的思维导图软件&#xff0c;支持 Windows、MacOS 和 Linux 系统。它提供了丰富的…

pytorch进阶学习(八):使用训练好的神经网络模型进行图片预测

课程资源&#xff1a; 【小学生都会的Pytorch】九、运用你的模型做预测&#xff08;1&#xff09;_哔哩哔哩_bilibili 笔记&#xff1a; pytorch进阶学习&#xff08;四&#xff09;&#xff1a;使用不同分类模型进行数据训练&#xff08;alexnet、resnet、vgg等&#xff09…

免费远程桌面连接工具合集

随着科技的进步和通信技术的发展&#xff0c;远程办公变得越来越普遍。这种办公模式有助于提高工作效率&#xff0c;对于员工来说很友好的是&#xff0c;上班变得更加灵活了。 今天就给大家推荐几款远程桌面连接工具&#xff0c;不仅可以电脑连接&#xff0c;手机也可以直接连…

读写分离导致读不到刚插入的数据

背景 前两天在做一个功能的时候&#xff0c;需要先插表&#xff0c;如果数据重复则从数据库中查询出这条数据&#xff0c;这段代码在测试环境并没有什么问题&#xff0c;但是到生产之后就会偶现的报一些错&#xff0c;就是读不到已插入的数据&#xff0c;导致后续业务出现问题…

超详细Django+vue+vscode前后端分离搭建

文章目录一、Django后端搭建1.1 创建项目和app1.2 注册app1.3 运行项目1.4 配置mysql数据库1.5 创建数据库类1.6 使用Django后台进行数据管理2、Django rest framework配置2.1 序列化2.2 添加视图2.3 添加路由2.4 在项目根目录下的urls中加入如下代码2.5 api测试2.6 筛选和搜索…

BGP协议解析(白话版)

之前一直没搞明白BGP有啥用&#xff0c;加了跟没加没啥区别&#xff0c;专门查资料写了这篇《BGP协议解析》。 下面使用eNSP模拟器演示&#xff01; IBGP与EBGP的区别 BGP分为两种&#xff1a;IBGP与EBGP。 两个路由器的BGP号相同&#xff0c;建立邻居关系叫IBGP&#xff0…

树莓派连接串口时无法开机

树莓派连接串口时无法开机我的情况我的思考我的解决过程重点参考我的情况 因为项目需要&#xff0c;因此需要使用树莓派控制电机&#xff0c;而电机是一上电就会给树莓派发送数据&#xff0c;而这时树莓派还正处于开机时&#xff0c;结果就是开机失败。当将串口断开时就又可以…

PHP快速入门05-时间日期与时区,附30个常用案例

文章目录前言一、时间日期与时区1.1 时间与日期1.2 时区二、 30个日期时间函数的用法示例2.1 获取当前的时间戳2.2 将时间戳格式化为日期时间2.3 获取当前的日期2.4 获取当前的时间2.5 获取当前年份2.6 获取当前月份2.7 获取当前日期的第几天2.8 计算两个日期之间的天数差2.9 计…

央媒报道的长与短

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体 胡老师。 在最近的媒体服务中&#xff0c;遇到一个问题&#xff0c;与大家讨论下&#xff0c;很多媒体特别是央媒&#xff0c;在活动报道中不会完全按照新闻稿通稿的内容去报道&#xff0c;有的会根…

MQ选型,kafka、RocketMQ、RabbitMQ、ActiveMQ

MQ&#xff08;Message Queue&#xff09;&#xff0c;是基础数据结构中“先进先出”的一种数据结构。指把要传输的数据&#xff08;消息&#xff09;放在队列中&#xff0c;用队列机制来实现消息传递——生产者产生消息并把消息放入队列&#xff0c;然后由消费者去处理。消费者…

java SimpleDateFormat和Calendar日期类

目录一、SimpleDateFormat使用二、Calendar使用一、SimpleDateFormat使用 使用Date直接输出日期时&#xff0c;是使用系统默认的格式输出&#xff0c;所以需要使用SimpleDateFormat来格式化日期。 那么SimpleDateFormat类怎么使用呢&#xff0c;我们需要先了解此类的格式化符号…

Codeforces Round 866 (Div. 2) 题解

目录 A. Yuras New Name&#xff08;构造&#xff09; 思路&#xff1a; 代码&#xff1a; B. JoJos Incredible Adventures&#xff08;构造&#xff09; 思路&#xff1a; 代码&#xff1a; C. Constructive Problem&#xff08;思维&#xff09; 思路&#xff1a; 代…

一、计算机的发展历史

一、计算机的发展历史 第一台现代计算机 ENIAC&#xff1a;世界上第一台现代通用电子数字计算机&#xff0c;诞生于1946年2月14日的美国宾夕法尼亚大学。研制电子计算机的想法产生于第二次世界大战进行期间。当时激战正酣&#xff0c;各国的武器装备还很差&#xff0c;占主要地…

Java垃圾收集原理

程序计数器、虚拟机栈、本地方法栈这三个区域随线程而灭&#xff0c;栈中栈帧的内存大小也是在确定的。这几个区域的内存分配和回收都具有确定性&#xff0c;因此不需要过多考虑如何回收。 Java堆和方法区这两个区域有着很显著的不确定性 一个接口的实现类需要的内存可能不一…

软考第七章 下一代互联网

下一代互联网 1.IPv6 IPv4的缺陷&#xff1a; 网络地址短缺路由速度慢&#xff0c;IPv4头部多达13个字段&#xff0c;路由器处理的信息量很大缺乏安全功能不支持新的业务模式 关于PIv6的研究成果都包含在1998年12月发表的RFC 2460文档中 1.1 IPv6分组格式 版本&#xff1a…

量子退火Python实战(3):投资组合优化(Portfolio) MathorCup2023特供PyQUBO教程

文章目录前言一、什么是投资组合优化&#xff1f;二、投资组合优化建模1. 目标函数&#xff1a;回报2.约束函数&#xff1a;风险3.最终优化目标函数三、基于PyQUBO实现1. 获取数据2. 数据处理3. 目标函数PyQUBO实现4. OpenJij实施优化总结前言 提示&#xff1a;包含pyQUBO用法…

硬件语言Verilog HDL牛客刷题day11 A里部分 和 Z兴部分

1.VL72 全加器 1.题目&#xff1a; ① 请用题目提供的半加器实现全加器电路① 半加器的参考代码如下&#xff0c;可在答案中添加并例化此代码。 2. 解题思路 &#xff08;可以看代码&#xff09; 2.1 先看 半加器 s 是加位 &#xff0c; C 是进位。 2.2 再看全加器 …