重学java 29.经典接口

光阴似箭,我好像跟不上

                        —— 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.mfbz.cn/a/596395.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue MVVM这一篇就够啦!

Vue vs React 相似之处: 它们都有使用 Virtual DOM虚拟DOM-CSDN博客&#xff1b;提供了响应式&#xff08;Reactive&#xff09;和组件化&#xff08;Composable&#xff09;的视图组件。将注意力集中保持在核心库&#xff0c;而将其他功能如路由和全局状态管理交给相关的库。R…

数塔问题(蛮力算法和动态规划)

题目&#xff1a;如下图是一个数塔&#xff0c;从顶部出发在每一个节点可以选择向左或者向右走&#xff0c;一直走到底层&#xff0c;要求找出一条路径&#xff0c;使得路径上的数字之和最大&#xff0c;及路径情况。(使用蛮力算法和动态规划算法分别实现&#xff09; #include…

AI预测福彩3D第10套算法实战化赚米验证第2弹2024年5月6日第2次测试

由于今天白天事情比较多&#xff0c;回来比较晚了&#xff0c;趁着还未开奖&#xff0c;赶紧把预测结果发出来吧~今天是第2次测试~ 2024年5月6日福彩3D预测结果 6-7码定位方案如下&#xff1a; 百位&#xff1a;3、4、1、7、8、9 十位&#xff1a;4、5、3、7、8、9 个位&#x…

# 怎么关闭 win10 系统中自带的【文件预览】功能?关闭WIN10【文件预览】功能的方法

怎么关闭 win10 系统中自带的【文件预览】功能&#xff1f;关闭WIN10【文件预览】功能的方法 win10 系统中自带的【文件预览】功能&#xff0c;默认是开启状态的&#xff0c;如果需要关闭它&#xff0c;一步搞定。 1、打开电脑文件浏览器&#xff0c;随便进入有文件的一个文件…

《QT实用小工具·五十五》带有标签、下划线的Material Design风格输入框

1、概述 源码放在文章末尾 该项目实现了一个带有标签动画、焦点动画、正确提示、错误警告的单行输入框控件。下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef LABELEDEDIT_H #define LABELEDEDIT_H#include <QObject> #include <QWidget>…

截取字符串的3种方法

一、截取字符串的实现 在C语言中&#xff0c;没有直接截取字符串的库函数&#xff0c;但是咱们可以借助其他函数实现这个功能。 1&#xff0e;最简单的方法 如果只是直接输出一个字符串的子串&#xff0c;只需要一个简单的printf函数即可。 #include <stdio.h> int m…

寒武纪及瑞芯微平台调用加速调研

文章目录 1 寒武纪加速平台简介1.1 加速平台简介1.1.1 算力硬件1.1.2 配套软件 1.2 部署流程简介1.3 部署环境搭建1.3.1 安装驱动1.3.2 安装CNToolKit1.3.3 配置模型移植开发环境 1.4 模型部署1.4.1 模型转换旧文件格式1.4.2 量化模型生成1.4.3 验证结果1.4.4 离线模型生成 1 寒…

LIUNX系统编程:进程池的实现

1.什么是进程池 每一个可执行程序&#xff0c;在被执行前都要转化为进程&#xff0c;操作系统都要为其创建PCB&#xff0c;地址空间&#xff0c;页表&#xff0c;构建映射关系&#xff0c;进程池就是创建进程时&#xff0c;创建很多个进程&#xff0c;如果要执行程序&#xff…

HTML_CSS学习:背景、鼠标相关属性

一、背景相关属性 相关代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>背景相关属性</title><style>body{background-color: greenyellow;}div{width: 400px;height: …

C语言-分支和循环语句、函数、数组、操作符、指针、结构体

目录 一、scanf和getchar二、产生随机数函数三、辗转相除法求最大公约数四、函数的参数4.1 实际参数&#xff08;实参&#xff09;4.2 形式参数&#xff08;形参&#xff09;4.3 内存分配 五、函数的调用5.1 传值调用5.1 传址调用 六、函数的声明和定义6.1 函数的声明6.2 函数的…

Day62:单调栈 LeedCode503. 下一个更大元素 II 42. 接雨水

503. 下一个更大元素 II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更大的数…

服务运维问题

2024-05-01&#xff08;docker 部署的 jar包自动关闭&#xff09; 查询运行情况&#xff1a;处于退出状态 docker ps -a 查询日志&#xff1a;看不出问题 docker logs -f --tail1000 demo-java 查询关于java服务日志&#xff1a;Out of memory: Kill process 16236 (java) …

智能BI产品设计

BI概念 目录 BI概念 一&#xff1a;与BI相关的几个重要概念 二&#xff1a;数据仓库 VS 数据库 BI架构 一&#xff1a;数据分析通用流程 二&#xff1a;BI平台基本架构 可视化图形 一&#xff1a;如何选择可视化图形 二&#xff1a;数据展示形式 三&#xff1a;数据…

ComfyUI 基础教程(十三):ComfyUI-Impact-Pack 面部修复

SD的WebUI 中的面部修复神器 ADetailer,无法在ComfyUI 中使用。那么如何在ComfyUI中进行面部处理呢?ComfyUI 中也有几个面部修复功能,比如ComfyUI Impact Pack(FaceDetailer),以及换脸插件Reactor和IPAdapter。 ComfyUI-Impact-Pack 是一个功能强大的插件,专为 ComfyUI …

GiantPandaCV | FasterTransformer Decoding 源码分析(三)-LayerNorm介绍

本文来源公众号“GiantPandaCV”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;FasterTransformer Decoding 源码分析(三)-LayerNorm介绍 作者丨进击的Killua 来源丨https://zhuanlan.zhihu.com/p/669440844 编辑丨GiantPandaC…

LLVM的ThinLTO编译优化技术在Postgresql中的应用

部分内容引用&#xff1a;https://blog.llvm.org/2016/06/thinlto-scalable-and-incremental-lto.html LTO是什么&#xff1f; 链接时优化&#xff08;Link-time optimization&#xff0c;简称LTO&#xff09;是编译器在链接时对程序进行的一种优化。它适用于以文件为单位编译…

考研数学|基础跟张宇,强化直接1000题还是先做660?

跟宇哥用1000题的&#xff0c;我愿称之为卷王之王&#xff01;660对基础阶段是绝佳的查漏补缺&#xff0c;必做&#xff01; 自我介绍一下&#xff1a;我21年一战数学83&#xff0c;总分没过线&#xff0c;22年二战143&#xff0c;逆袭上岸211&#xff01;660是我的心头好&…

奶爸预备 |《伯克毕生发展心理学.从0岁到青少年》 / (美) 劳拉·E. 伯克著——读书笔记

目录 引出第一篇 人的发展理论与研究第1章 历史、理论和研究方法 第二篇 发展的基础第2章 生物基础与环境基础第3章 孕期发育、分娩及新生儿 第三篇 婴儿期和学步期&#xff1a;0~2岁第4章 婴儿期和学步期的身体发育第5章 婴儿期和学步期的认知发展第6章 婴儿期和学步期的情绪与…

华为OD机试【垃圾信息拦截】(java)(100分)

1、题目描述 大众对垃圾短信深恶痛绝&#xff0c;希望能对垃圾短信发送者进行识别&#xff0c;为此&#xff0c;很多软件增加 了垃圾短信识别机制。经分析&#xff0c;发现正常用户的短信通常具备交互性&#xff0c;而垃圾短信往 往都是大量单向的短信&#xff0c;按照如下规则…

vue3中标签的ref属性

组合API-ref属性 在vue2.x中&#xff0c;可以通过给元素添加refxxx属性&#xff0c;然后在代码中通过this.$refs.xxx获取到对应的元素 然而在vue3中时没有$refs这个东西的&#xff0c;因此vue3中通过ref属性获取元素就不能按照vue2的方式来获取。 目标&#xff1a;掌握使用re…
最新文章