首页 > 编程语言 >Java 比较器 (详细现实案例代码拆解)

Java 比较器 (详细现实案例代码拆解)

时间:2025-01-20 20:56:37浏览次数:3  
标签:Java 卡片 Runner age 案例 拆解 new public runners

前言:

小编最近又要练科目三了

天天好多事情啊,

不知道大家放了假事情多不多

我们继续日更!!!

我们一直都是以这样的形式,让新手小白轻松理解复杂晦涩的概念,

把Java代码拆解的清清楚楚,每一步都知道他是怎么来的,

为什么用这串代码关键字,对比同类型的代码,

让大家真正看完以后融会贯通,举一反三,实践应用!!!!


①官方定义  和  大白话拆解对比

②举生活中常见贴合例子、图解辅助理解的形式

③对代码实例中关键部分进行详细拆解、总结



给小编一个赞或者关注吧,我们一起进步!!

在Java中,基本数据类型(如int、float等)可以直接使用比较运算符(如<、>、==等)进行比较。但是,引用数据类型(如对象)不能直接使用这些比较运算符来比较大小。这是因为引用数据类型的比较通常涉及到对象的属性和状态,而不仅仅是它们的内存地址。

官方语言:


在Java中,实现对象排序的方式有两种:

  • 自然排序:通过实现java.lang.Comparable接口。
  • 定制排序:通过实现java.util.Comparator接口。

自然排序

  • 实现Comparable接口的类需要重写compareTo()方法。
  • compareTo()方法返回一个整数,表示两个对象之间的顺序关系:
  • 如果返回值小于0,表示当前对象小于参数对象。
  • 如果返回值等于0,表示当前对象等于参数对象。
  • 如果返回值大于0,表示当前对象大于参数对象。

定制排序

  • 使用Comparator接口可以提供更灵活的排序方式。
  • Comparator接口包含compare()方法,用于比较两个对象。

大白话拆解:

有一堆卡片,每张卡片上都有一个名字和一个年龄。如果你想按年龄从小到大排列这些卡片,你可以:

自然排序:给每张卡片添加一个规则,告诉它如何知道自己比其他卡片大还是小。比如,卡片会说:“如果我的年龄比你的年龄大,我就排在你后面。”这样,所有卡片都能自己找到合适的位置。

class Person implements Comparable<Person> {
    private String name;
    private int age;

    // 构造函数和其他方法省略...

    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age);
    }
}

定制排序:找一个裁判,这个裁判知道怎么比较两张卡片。裁判会说:“我来决定谁在前面,谁在后面。”这样,裁判就能帮你把卡片排好顺序。

class AgeComparator implements Comparator<Person> {
    @Override
    public int compare(Person p1, Person p2) {
        return Integer.compare(p1.getAge(), p2.getAge());
    }
}

举个栗子:

案例描述:

  • 正在组织一场马拉松比赛,并且需要根据参赛者的年龄(自然排序)和完成时间(定制排序)对他们进行排序。

1.1自然顺序案例:按年龄排序

  • 首先,让我们创建一个Runner类,代表马拉松比赛的参赛者。这个类将实现Comparable接口,以便我们可以根据参赛者的年龄对它们进行自然排序。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

class Runner implements Comparable<Runner> {
    private String name;
    private int age;
    private double finishTime; // 完成时间,单位为小时

    public Runner(String name, int age, double finishTime) {
        this.name = name;
        this.age = age;
        this.finishTime = finishTime;
    }

    public int getAge() {
        return age;
    }

    public double getFinishTime() {
        return finishTime;
    }

    @Override
    public int compareTo(Runner other) {
        return Integer.compare(this.age, other.age);
    }

    @Override
    public String toString() {
        return name + " (age: " + age + ", time: " + finishTime + ")";
    }
}

public class Marathon {
    public static void main(String[] args) {
        List<Runner> runners = new ArrayList<>();
        runners.add(new Runner("Alice", 30, 3.5));
        runners.add(new Runner("Bob", 28, 3.7));
        runners.add(new Runner("Charlie", 35, 3.2));

        Collections.sort(runners);

        System.out.println("Runners sorted by age:");
        for (Runner runner : runners) {
            System.out.println(runner);
        }
    }
}

1.1代码解释和总结:

1、定义runner类:

class Runner implements Comparable<Runner> {
    private String name;
    private int age;
    private double finishTime; // 完成时间,单位为小时

    public Runner(String name, int age, double finishTime) {
        this.name = name;
        this.age = age;
        this.finishTime = finishTime;
    }

    public int getAge() {
        return age;
    }

    public double getFinishTime() {
        return finishTime;
    }

    @Override
    public int compareTo(Runner other) {
        return Integer.compare(this.age, other.age);
    }

    @Override
    public String toString() {
        return name + " (age: " + age + ", time: " + finishTime + ")";
    }
}
  • 属性:每个Runner对象都有三个属性——名字(name)、年龄(age)和完成时间(finishTime)。这就像每张卡片上记录了选手的名字、年龄和他们跑完全程的时间。
  • 构造函数:创建一个新的Runner对象时,你需要提供他们的名字、年龄和完成时间。这就像是填写一张新的选手信息卡片。
  • compareTo方法:这是用来比较两个Runner对象的。这里我们按照年龄来比较,如果当前选手比另一个选手年轻,则返回负数;如果年龄相同,则返回0;如果当前选手比另一个选手年长,则返回正数。这就好比在比较两张卡片上的年龄信息,决定谁应该排在前面。
  • toString方法:这个方法用于生成一个字符串表示,方便打印出选手的信息。比如,打印出来的信息可能是"Alice (age: 30, time: 3.5)"。

2、在Marathon类中使用Runner

public class Marathon {
    public static void main(String[] args) {
        List<Runner> runners = new ArrayList<>();
        runners.add(new Runner("Alice", 30, 3.5));
        runners.add(new Runner("Bob", 28, 3.7));
        runners.add(new Runner("Charlie", 35, 3.2));

        Collections.sort(runners);

        System.out.println("Runners sorted by age:");
        for (Runner runner : runners) {
            System.out.println(runner);
        }
    }
}
  • 创建List:首先,我们创建了一个列表runners,用来存储所有的选手信息。这就像准备了一堆空的卡片位置,等待填入选手的信息。
  • 添加选手:然后,我们向列表中添加了几个Runner对象。这相当于在卡片上填写了选手的名字、年龄和完成时间,并将这些卡片放入我们的列表中。
  • 排序:Collections.sort(runners);这行代码会自动调用每个Runner对象中的compareTo方法,按照年龄对所有选手进行排序。这就像按年龄大小重新排列你的卡片。
  • 打印结果:最后,通过循环遍历排序后的列表并打印出每个选手的信息,我们可以看到选手们已经根据年龄从小到大排列好了。

1.2定制顺序案例:按完成时间排序

  • 接下来,我们将创建一个FinishTimeComparator类,用于比较两个参赛者基于他们的完成时间。然后,我们将使用这个比较器对参赛者列表进行排序。
import java.util.Comparator;

class FinishTimeComparator implements Comparator<Runner> {
    @Override
    public int compare(Runner r1, Runner r2) {
        return Double.compare(r1.getFinishTime(), r2.getFinishTime());
    }
}

public class MarathonWithCustomSorting {
    public static void main(String[] args) {
        List<Runner> runners = new ArrayList<>();
        runners.add(new Runner("Alice", 30, 3.5));
        runners.add(new Runner("Bob", 28, 3.7));
        runners.add(new Runner("Charlie", 35, 3.2));

        // 使用自定义的比较器
        runners.sort(new FinishTimeComparator());

        System.out.println("Runners sorted by finish time:");
        for (Runner runner : runners) {
            System.out.println(runner);
        }
    }
}

1.2代码解释和总结:

1、定义FinishTimeComparator类

import java.util.Comparator;

class FinishTimeComparator implements Comparator<Runner> {
    @Override
    public int compare(Runner r1, Runner r2) {
        return Double.compare(r1.getFinishTime(), r2.getFinishTime());
    }
}
  • FinishTimeComparator类:这个类实现了Comparator<Runner>接口,这意味着它是一个专门用来比较Runner对象的“工具”。在这个场景中,我们使用它来比较两个选手的完成时间。
  • compare方法:这是Comparator接口要求必须实现的方法。它接受两个Runner对象作为参数(在这里命名为r1和r2),然后返回一个整数:
  • 如果r1的完成时间比r2短,返回负数;
  • 如果两者相同,返回0;
  • 如果r1的完成时间比r2长,则返回正数。 这个过程就像是在比较两张卡片上的完成时间,以决定哪个选手应该排在前面。

2、在MarathonWithCustomSorting类中使用自定义比较器

public class MarathonWithCustomSorting {
    public static void main(String[] args) {
        List<Runner> runners = new ArrayList<>();
        runners.add(new Runner("Alice", 30, 3.5));
        runners.add(new Runner("Bob", 28, 3.7));
        runners.add(new Runner("Charlie", 35, 3.2));

        // 使用自定义的比较器
        runners.sort(new FinishTimeComparator());

        System.out.println("Runners sorted by finish time:");
        for (Runner runner : runners) {
            System.out.println(runner);
        }
    }
}
  • 创建List并添加选手:首先,我们创建了一个runners列表,并向其中添加了几个Runner对象。这就像准备了一些记录选手信息的卡片,每张卡片上都有选手的名字、年龄和完成时间。
  • 使用自定义比较器进行排序:runners.sort(new FinishTimeComparator());这一行代码告诉程序按照我们之前定义的FinishTimeComparator来进行排序。换句话说,就是让程序根据每个选手的完成时间重新排列这些卡片。
  • 打印排序结果:最后,通过循环遍历排序后的列表并打印出每个选手的信息,我们可以看到选手们已经根据他们的完成时间从快到慢排列好了。这就像把所有记录选手信息的卡片按完成时间顺序整齐地排列出来。



我们今天就到这里,下次见吧!!



标签:Java,卡片,Runner,age,案例,拆解,new,public,runners
From: https://blog.csdn.net/2401_86356924/article/details/145269115

相关文章

  • Java基础
    什么是字节码?采用字节码的好处是什么?JVM可以理解的代码就叫做字节码。Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。由于字节码并不针对一种特定的机器,因此,Java程序无须重新编译便可在多种不同操作系统的计......
  • 深入浅出SpringSecurity,Java程序员必备的!
    前言在Java应用开发领域,安全管理始终是一个不可忽视的重要议题。随着SpringBoot和微服务架构的日益普及,SpringSecurity这一安全框架逐渐成为了众多Java开发者关注的焦点。其之所以能够获得如此青睐,很大程度上得益于微服务架构的兴起。作为Spring生态圈中不可或缺的一员,Sp......
  • Java程序员如何才能精通SpringBoot?
    前言回想当初我们刚开始接触Java,搭建一个Web应用的场景历历在目:1、精心配置web.xml,确保spring和springmvc得以加载。2、细心设置数据库连接,以及spring事务的处理。3、耐心安排配置文件的读取,激活必要的注解。4、繁琐地配置日志文件,以期项目运行平稳。5、一切配置就绪......
  • JavaScript学习(三)
    有事情的缘故导致中间几天没有进行学习。今天开始继续后端的学习,学习的第五天(2025.1.20)JavaScript 函数定义        JavaScript使用关键字 function 定义函数。        函数可以通过声明定义,也可以是一个表达式。        函数声明   ......
  • Java实现DES编码加解密 - 密钥为: Text
    编写工具类publicclassDesPasswordUtil{publicstaticfinalStringWIFI_DES_KEY="TmuhP9PD";/***生成密钥**@return{@linkString}*@throwsException例外*/publicstaticSecretKeySpeccreateKeyFromText(Stri......
  • Java实现DES编码加解密 - 密钥为: Hex
    编写工具类publicclassDesPasswordUtil{publicstaticfinalStringWIFI_DES_KEY="TmuhP9PDtcQ=";/***生成密钥**@return{@linkString}*@throwsException例外*/publicstaticStringgenerateKey()throwsExce......
  • JAVA动态代理
    什么是动态代理  动态代理是一种设计模式,允许开发者在运行时动态地创建实现了一组接口的代理对象。这些代理对象在调用目标对象的方法时,可以在方法调用前后添加自定义的逻辑,而无需修改目标对象的代码。动态代理的核心思想是提供一种灵活的方式来增强或改变原有对象的行为......
  • 小程序自动化案例展示01--琪琪爱玩-小程序
    背景“琪琪爱玩”小程序功能丰富,涵盖领金币页面、图片找不同页面以及汉字找不同页面。每个页面都设有视频广告入口,用户能通过观看广告获取奖励。这种复杂的功能架构和用户-广告互动模式,对测试工作提出了极高要求。传统人工测试不仅耗时费力,还难以保证测试的全面性和准确性......
  • 在Java中什么是异常
    目录         一、定义:二、异常的类型1、检查型异常(CheckExceptions)2、运行时异常(RuntimeExceptions)3、错误(Errors)三、异常处理机制1、try-catch块2、finally块3、throws关键字四、自定义异常1、定义:2、示例:一、定义:异常(Exception)是在程序执行过程......
  • 【K8S系列】K8s 领域深度剖析:年度技术、工具与实战总结 (思维导图-java架构)
    创建一个关于Kubernetes(简称K8s)领域的深度剖析年度总结的思维导图,特别是针对Java架构师的需求,可以帮助梳理和理解过去一年中重要的技术进展、工具以及实战经验。下面是一个基于文本的思维导图结构建议,你可以根据这个结构使用任何思维导图软件来创建你的图形化版本。Kuberne......