重学java 29.经典接口

news2024/9/22 11:34:30

光阴似箭,我好像跟不上

                        —— 24.5.6

一、java.lang.Comparable

        我们知道基本数据类型的数据(除boolean类型外)需要比较大小的话,直接使用比较运算符即可,但是引用数据类型是不能直接使用比较运算符来比较大小的。那么,如何解决这个问题呢?
        java给所有引用数据类型的大小比较,指定了一个标准接口,就是java.lang.Comparable接口:

package java.lang;

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

那么我们想要使得我们某个类的对象可以比较大小,怎么做呢?

步骤:
        第一步:哪个类的对象要比较大小,哪个类就实现java.lang.Comparable接口,并重写方法。

                方法体就是你要如何比较当前对象和指定的另一个对象的大小

        第二步:对象比较大小时,通过对象调用compareTo方法,根据方法的返回值决定谁大谁小。
                this对象(调用compareTo方法的对象)减指定对象(传入compareTo()的参数对象)大于0,返回正整数

                this对象(调用compareTo方法的对象)减指定对象(传入compareTo()的参数对象)小于0返回负整数

                this对象(调用compareTo方法的对象)减指定对象(传入compareTo()的参数对象)等于0返回

CompareTo函数:

public class Student implements Comparable {
    private String name;
    private int Score;

    public Student(String name, int score) {
        this.name = name;
        Score = score;
    }

    public Student() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getScore() {
        return Score;
    }

    public void setScore(int score) {
        Score = score;
    }


    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", Score=" + Score +
                '}';
    }

    //    this代表students[i]
    //    o代表students[i+1]
    //    如果students[i].getscore()-students[i+1].getstore()>0
    //    证明数组中的钱一个对象比后一个对象分数高
    @Override
    public int compareTo(Object o) {
        // 向下转型
        Student s = (Student) o;
        return this.getScore()-s.getScore();
    }
}

Test:

    public static void main(String[] args) {
        // 创建一个数组
        Student[] students = new Student[3];
        Student s1 = new Student("张三",100);
        Student s2 = new Student("李四",60);
        Student s3 = new Student("王五",90);
        students[0]=s1;
        students[1]=s2;
        students[2]=s3;

        for (int j = 0; j < students.length-1; j++) {
            for (int i = 0; i < students.length-1-j; i++) {
                // 如果students[i]>students[i+1],就换位置
                if (students[i].compareTo(students[i+1])>0){
                    Student tmp = students[i];
                    students[i] = students[i+1];
                    students[i+1] = tmp;
                }
            }
        }

    //  遍历一下
        for (int i = 0; i < students.length; i++) {
            System.out.println(students[i]);
        }
    }

二、java.util.Comparator

思考:
        (1)如果一个类,没有实现Comparabe接口,而这个类你又不方便修改(例如:一些第三方的类,你只有.class文件,没有源文件),那么这样类的对象也要比较大小怎么办?
        (2)如果一个类,实现了Comparable接口,也指定了两个对象的比较大小的规则,但是此时此刻我不想按照它预定义的方法比较大小,但是我又不能随意修改,因为会影响其他地方的使用,怎么办?

        JDK在设计类库之初,也考虑到这种情况了,所以又增加了一个java.util.Comparator接口。

package java.util;

public interface Comparator{
    int compare(Object o1,Object o2);
}

步骤:

        第一步:编写一个类,我们称之为比较器类型,实现java.ulil.Comparator接口,并重写方法。

                方法体就是你要如何指定的两个对象的大小
        第二步:比较大小时,通过比较器类型的对象调用compare()方法,将要比较大小的两个对象作为compare方法的实参传入,根据方法的返回值决定谁大谁小。
        o1对象减o2大于0返回正整数
        o1对象减o2小于0返回负整数
        o1对象减o2等于0返回零

Comparator函数

import java.util.Comparator;

public class Student2 implements Comparator {
    private String name;
    private int Score;

    public Student2(String name, int score) {
        this.name = name;
        Score = score;
    }

    public Student2() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getScore() {
        return Score;
    }

    public void setScore(int score) {
        Score = score;
    }


    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", Score=" + Score +
                '}';
    }

//    o1代表students[i]
//    o2代表students[i+1]
//    如果o1的分数>o2的分数,compare方法返回正整数
//    如果o1的分数<o2的分数,compare方法返回负整数
//    如果o1的分数=o2的分数,compare方法返回0

    @Override
    public int compare(Object o1, Object o2) {
        Student2 s1 = (Student2) o1;
        Student2 s2 = (Student2) o2;
        return s1.getScore()-s2.getScore();
    }
}

Test函数

public class Demo160ClassicObject2 {
    public static void main(String[] args) {
        // 创建一个数组
        Student2[] students = new Student2[3];
        Student2 s1 = new Student2("张三",100);
        Student2 s2 = new Student2("李四",60);
        Student2 s3 = new Student2("王五",90);
        students[0]=s1;
        students[1]=s2;
        students[2]=s3;

        Student2 student = new Student2();

        for (int j = 0; j < students.length-1; j++) {
            for (int i = 0; i < students.length-1-j; i++) {
                // 如果students[i]>students[i+1],就换位置
                if (student.compare(students[i],students[i+1])>0){
                    Student2 tmp = students[i];
                    students[i] = students[i+1];
                    students[i+1] = tmp;
                }
            }
        }

        //  遍历一下
        for (int i = 0; i < students.length; i++) {
            System.out.println(students[i]);
        }
    }
}

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

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

相关文章

linux部署java1.8(jdk1.8)

两种方式&#xff1a; 方式一 1.输入查找命令&#xff1a; yum -y list java*2.输入安装命令&#xff1a; yum install -y java-1.8.0-openjdk.x86_643.测试是否已经安装&#xff1a; java -version方式二&#xff1a; 点击链接进入官网&#xff1a;https://www.oracle.com/…

【教程】极简Python接入免费语音识别API

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;请不吝给个[点赞、收藏、关注]哦~ 安装库&#xff1a; pip install SpeechRecognition 使用方法&#xff1a; import speech_recognition as srr sr.Recognizer() harvard sr…

idea2023.2.5的控制台动态配置当前环境

一、idea2023.2.5的控制台动态配置当前环境 1.1、idea版本 1.2、配置方式 1.2.1、方式一 1.2.2、方式二 1.3、参考 https://blog.csdn.net/xiaoheihai666/article/details/127757658

使用idea编辑器回退git已经push的代码

直接上结果 选择想要回退的那次/多次提交历史, 右击, 选中 revert commit git自动产生一个Revert记录&#xff0c;然后我们会看到git自动将我第三次错误提交代码回退了&#xff0c;这个其实就相当于git帮我们手动回退了代码。 后续&#xff0c;只需要我们将本次改动push到远…

从零开始的软件测试学习之旅(五)web测试项目

这里写目录标题 功能型测试非功能性测试面试拓展项目与数据库关系 测试用例设计—基于TPshop前台下单流程 功能型测试 一.设计测试 a,需求分析 1.输入分析 分析项目中要求如:输入长度,类型要求,组成规则,是否为空,是否重复 2.交付分析 判断所有数据正确,有错误给出提示(优化…

锂电池SOH估计 | Matlab实现基于ALO-SVR模型的锂电池SOH估计

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 锂电池SOH估计 | Matlab实现基于ALO-SVR模型的锂电池SOH估计 蚁狮优化支持向量机锂电池健康状态SOH估计&#xff1b; 具体流程如下&#xff1b; 1、分析锂离子电池老化数据集&#xff0c;从中选取具有代表电池性能衰减…

2024第2届华东国际宠物用品展(苏州)

第2届华东宠物展&#xff08;苏州&#xff09;2024.06.28-30 苏州国际博览中心 中国宠业新锐品牌展 400海外展商 20000平方展出面积 3000知名品牌 60000优质观众 参展组委会咨询&#xff1a;深宠展邹春宇 关于展会 第2届华东国际宠物用品展览会(苏州)暨中国宠业新锐品牌…

【自用】了解移动存储卡的基本信息

前言 本文是看B站视频做的一个简单笔记&#xff0c;方便日后自己快速回顾&#xff0c;内容主要介绍了存储卡基本参数&#xff0c;了解卡面上的数字、图标代表的含义。对于日后如何挑选判断一张存储卡的好坏、判别一张存储卡是否合格有一定帮助。 视频参考链接&#xff1a;【硬…

嵌入式Linux学习第二天

今天学习linuxC编程。首先要熟悉linux下编写c程序的过程。 编写程序Hello World! 首先创建存放程序的文件夹&#xff0c;如下图所示&#xff1a; 接下来在创建一个文件夹来保存这节要编写的代码。指令&#xff1a;mkdir 3.1 接下来我们要设置VIM编辑器的一些配置&#xff0…

karateclub,一个超酷的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超酷的 Python 库 - karateclub。 Github地址&#xff1a;https://github.com/benedekrozemberczki/karateclub Python karateclub是一个用于图嵌入和图聚类的库&#xff…

ERP系统电子文件归档和电子档案管理规范

ERP系统电子文件归档和电子档案管理规范 1 范围 本文件描述了企业资源计划&#xff08;ERP&#xff09;系统形成电子文件归档和电子档案管理的方法。 本文件适用于企业资源计划&#xff08;ERP&#xff09;系统&#xff08;含采购、销售、物料、生产计划、质量、设备、项目…

linux学习:线程池

目录 原理 初始线程池 运行中的线程池 相关结构体 api 线程池初始化 投送任务 增加活跃线程 删除活跃线程 销毁线程池 例子 thread_pool.h thread_pool.c test.c 测试程序 原理 一个进程中的线程就好比是一家公司里的员工&#xff0c;员工的数目应该根据公司的…

LangChain 概念篇(喂饭级)

LangChain 介绍 LangChain 是一个用于开发由语言模型驱动的应用程序的框架。 LangChain 框架的设计目标 支持应用程序让其不仅会通过 API 调用语言模型&#xff0c;而且还会数据感知&#xff08;将语言模型连接到其他数据源&#xff09;&#xff0c;Be agentic&#xff08;允…

ncnn 算子操作描述

ncnn 算子操作描述&#xff0c;具体查询见 ncnn/docs/developer-guide/operators.md at master Tencent/ncnn GitHub 都是从上述地方copy过来的&#xff0c;做备份。 具体如下&#xff1a; 1.AbsVal: 计算输入张量中的每个元素的绝对值。 y abs(x)one_blob_only 只支持…

SpringBoot中实现发送邮件

概要 在Spring Boot中发送电子邮件相对简单。你可以使用Spring的邮件支持来实现这一点。 步骤&#xff1a; 1.添加依赖&#xff1a;首先&#xff0c;需要在你的pom.xml文件中添加Spring Boot的邮件发送器依赖。 2. 配置邮件服务器&#xff1a;在application.properties或app…

Netty 网络编程深入学习【一】:ByteBuffer 源码解析

ByteBuffer源码阅读 ByteBuffer是一个用于处理字节数据的缓冲区类。它是Java NIO 包的一部分&#xff0c;提供了一种高效的方式来处理原始字节数据。 ByteBuffer 可以用来读取、写入、修改和操作字节数据&#xff0c;它是一种直接操作字节的方式&#xff0c;比起传统的 InputSt…

生成一个好故事!StoryDiffusion:一致自注意力和语义运动预测器必不可少(南开字节)

文章链接&#xff1a;https://arxiv.org/pdf/2405.01434 主页&#xff1a;https://storydiffusion.github.io/ 对于最近基于扩散的生成模型来说&#xff0c;在一系列生成的图像中保持一致的内容&#xff0c;尤其是那些包含主题和复杂细节的图像&#xff0c;是一个重大挑战。本…

什么是抖音橱窗?它和抖音小店有什么区别?普通人更适合做哪个?

大家好&#xff0c;我是电商糖果 相信有很多想在抖音卖货的朋友&#xff0c;都会搞不清抖音橱窗是什么&#xff1f; 甚至会把它和抖音小店当成一个项目&#xff0c;也不知道哪个更适合自己。 自己越了解发现越迷糊&#xff0c;有的说不需要直播&#xff0c;粉丝&#xff0c;…

Wireshark明文抓取

目录 原理 配置 1、配置环境变量 2、Wireshark配置 原理 SSLKEYLOGFILE是一个用于记录SSL/TLS会话中使用的密钥的文件。它主要用于调试和分析SSL/TLS协议。当启用了SSLKEYLOGFILE配置&#xff0c;系统会将所有SSL/TLS会话中使用的密钥记录到指定的文件中。这些密钥可以用来…

SQL注入——绕过information

衔接上文&#xff0c;进一步对SQL注入less-1进行禁止information的操作&#xff0c;上文连接如下&#xff1a; SQL注入less-1-CSDN博客 一、对less-1进行编辑 增加一段代码&#xff0c;作用是禁止information字段 二、进行检查 可以看到代码已经生效&#xff0c;禁止用infor…