前言:
小编最近又要练科目三了
天天好多事情啊,
不知道大家放了假事情多不多
我们继续日更!!!
我们一直都是以这样的形式,让新手小白轻松理解复杂晦涩的概念,
把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