0
点赞
收藏
分享

微信扫一扫

00013.02常用接口:java.util.Comparator

王远洋 2023-02-20 阅读 65


一、常用接口:java.util.Comparator(1)

1、引入

00013.02常用接口:java.util.Comparator_System


00013.02常用接口:java.util.Comparator_ide_02


00013.02常用接口:java.util.Comparator_System_03


java.util.Comparator接口:抽象方法:int compare(T o1, T o2)

因为是泛型,我们还没讲。现在就把T擦除,换成Object

java.util.Comparator接口: 抽象方法:int compare(Object o1, Object o2)

这个接口是代表Java中比较两个对象的大小标准。而且是一种“定制”比较的标准。

这个接口中没有规定如何比较两个对象的大小,

但是规定了,如果你认为o1 大于 o2,就返回正整数表示,如果你认为o1 小于 o2,就返回负整数表示,如果你认为o1 等于 o2,就返回0表示*/

2、举例

如下:”声明一个 Student,并且对它进行属性、构造器、get/set 和方法内容描写,最后加一个重写:toString()

00013.02常用接口:java.util.Comparator_System_04


下面我们怎么做呢?我们在main()方法里面建立两个学生对象

00013.02常用接口:java.util.Comparator_ide_05


所以java中规定,你要对象比较就必须使用Comparator

那么怎么实现Comparator呢?

00013.02常用接口:java.util.Comparator_System_06


再根据提示重写

00013.02常用接口:java.util.Comparator_System_07


00013.02常用接口:java.util.Comparator_System_08


这样,其实也访问不了学生的属性

所以要向下转型

00013.02常用接口:java.util.Comparator_java_09


创建完AgeComparator类,重写完Comparator后就可以用了

00013.02常用接口:java.util.Comparator_java_10

3、扩展

如果想按照成绩怎么办?

再实现一遍即可

00013.02常用接口:java.util.Comparator_System_11


00013.02常用接口:java.util.Comparator_java_12


此部分完整代码如下:

/*  java.util.Comparator<T>接口:
抽象方法:int compare(T o1, T o2)
因为<T>是泛型,我们还没讲。现在就把T擦除,换成Object
java.util.Comparator接口:
抽象方法:int compare(Object o1, Object o2)
这个接口是代表Java中比较两个对象的大小标准。而且是一种“定制”比较的标准。
这个接口中没有规定如何比较两个对象的大小,
但是规定了,如果你认为o1 大于 o2,就返回正整数表示,如果你认为o1 小于 o2,就返回负整数表示,如果你认为o1 等于 o2,就返回0表示*/
package com.atguigu.test03;

import java.util.Comparator;

public class TestComparator {

public static void main(String[] args) {
Student s1=new Student("张三",20,80);
Student s2=new Student("李四",23,99);
//比较s1和s2的大小
/* if(s1 > s2){//错误的
System.out.println("s1 > s2");
}*/
//所以java中规定你要对象比较就必须使用Comparator,那么怎么实现Comparator呢?

//创建完AgeComparator类,重写完Comparator后就可以用了
AgeComparator a=new AgeComparator();
if(a.compare(s1, s2)>0){
System.out.println("s1 > s2的年龄");
}
else if(a.compare(s1, s2)<0){
System.out.println("s1 < s2的年龄");
}
else{
System.out.println("s1 = s2的年龄");
}
//(3)、扩展
//创建完ScoreComparator类,重写完Comparator后就可以用了
ScoreComparator s=new ScoreComparator();
if(s.compare(s1, s2)>0){
System.out.println("s1 > s2的成绩");
}
else if(s.compare(s1, s2)<0){
System.out.println("s1 < s2的成绩");
}
else{
System.out.println("s1 = s2的成绩");
}
}
}
//实现Comparator接口,来定制学生比较的具体方式
//例如:按年龄比较
class AgeComparator implements Comparator{

@Override
public int compare(Object o1, Object o2) {
//(1)向下转型
Student s1=(Student)o1;
Student s2=(Student)o2;
//(2)开始比较
if(s1.getAge()>s2.getAge()){
return 1;
}
else if(s1.getAge()<s2.getAge()){
return -1;
}
return 0;
}

}
//3、扩展
//实现Comparator接口,来定制学生比较的具体实现方式
//例如再加一个按成绩比较,再实现一遍即可
class ScoreComparator implements Comparator{

@Override
public int compare(Object o1, Object o2) {
//(1)向下转型
Student s1=(Student)o1;
Student s2=(Student)o2;
//(2)开始比较
if(s1.getScore()>s2.getScore()){
return 1;
}
else if(s1.getScore()<s2.getScore()){
return -1;
}
else{
return 0;
}
}
}

//声明一个 Student
class Student{
//属性
private String name;
private int age;
private int score;
//构造器
public Student() {
super();
}
public Student(String name, int age, int score) {
super();
this.name = name;
this.age = age;
this.score = score;
}
//get/set
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
//重写toString()
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", score=" + score + "]";
}
}

4、思考一个问题,比较有什么用呢?

除了以上的例子可以用到外还有别的什么地方能用到吗?

试试数组

00013.02常用接口:java.util.Comparator_System_13


00013.02常用接口:java.util.Comparator_System_14


因为你没具体说按什么排序啊

再看API文档

00013.02常用接口:java.util.Comparator_ide_15


00013.02常用接口:java.util.Comparator_System_16


00013.02常用接口:java.util.Comparator_System_17


00013.02常用接口:java.util.Comparator_java_18


00013.02常用接口:java.util.Comparator_System_19

至于它内部怎么排序,我们先不管,原理跟我们前面是一样的
至此,完整代码如下:

package com.atguigu.test03;

import java.util.Arrays;
import java.util.Comparator;

public class TestComparator {

public static void main(String[] args) {
Student s1=new Student("刘一",20,80);
Student s2=new Student("陈二",23,99);


//比较s1和s2的大小
/* if(s1 > s2){//错误的
System.out.println("s1 > s2");
}*/
//所以java中规定你要对象比较就必须使用Comparator,那么怎么实现Comparator呢?

//创建完AgeComparator类,重写完Comparator后就可以用了
AgeComparator a=new AgeComparator();
if(a.compare(s1, s2)>0){
System.out.println("s1 > s2的年龄");
}
else if(a.compare(s1, s2)<0){
System.out.println("s1 < s2的年龄");
}
else{
System.out.println("s1 = s2的年龄");
}
//(3)、扩展
//创建完ScoreComparator类,重写完Comparator后就可以用了
ScoreComparator s=new ScoreComparator();
if(s.compare(s1, s2)>0){
System.out.println("s1 > s2的成绩");
}
else if(s.compare(s1, s2)<0){
System.out.println("s1 < s2的成绩");
}
else{
System.out.println("s1 = s2的成绩");
}

//4、除了以上的例子可以用到外还有别的什么地方能用到吗?有,比如:数组
Student [] all =new Student[5];
all[0]=s1;
all[1]=s2;
all[2]=new Student("张三",25,70);
all[3]=new Student("李四",23,70);
all[4]=new Student("张三",26,70);
//Arrays.sort(all);直接使用会报错
//public static <T> void sort(T[] a, Comparator<? super T> c)
//改成如下:
//public static void sort(Object[] a, Comparator c)
Arrays.sort(all,new AgeComparator());//这样就按年龄排序了
for (int i = 0; i < all.length; i++) {
System.out.println(all[i]);
}
}
}
//实现Comparator接口,来定制学生比较的具体方式
//例如:按年龄比较
class AgeComparator implements Comparator{

@Override
public int compare(Object o1, Object o2) {
//(1)向下转型
Student s1=(Student)o1;
Student s2=(Student)o2;
//(2)开始比较
if(s1.getAge()>s2.getAge()){
return 1;
}
else if(s1.getAge()<s2.getAge()){
return -1;
}
return 0;
}

}
//3、扩展
//实现Comparator接口,来定制学生比较的具体实现方式
//例如再加一个按成绩比较,再实现一遍即可
class ScoreComparator implements Comparator{

@Override
public int compare(Object o1, Object o2) {
//(1)向下转型
Student s1=(Student)o1;
Student s2=(Student)o2;
//(2)开始比较
if(s1.getScore()>s2.getScore()){
return 1;
}
else if(s1.getScore()<s2.getScore()){
return -1;
}
else{
return 0;
}
}
}

//声明一个 Student
class Student{
//属性
private String name;
private int age;
private int score;
//构造器
public Student() {
super();
}
public Student(String name, int age, int score) {
super();
this.name = name;
this.age = age;
this.score = score;
}
//get/set
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
//重写toString()
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", score=" + score + "]";
}
}

二、常用接口:java.util.Comparator(2)

下面我们来看一个全新的需求

00013.02常用接口:java.util.Comparator_ide_20


00013.02常用接口:java.util.Comparator_java_21

我们没法写,但是又有这个需求怎么办,这就需要我吗遵循java规范

00013.02常用接口:java.util.Comparator_System_22


标准就是你不仅给我传一个数组,还得给我传一个比较器的对象进来而且 java.util.Comparator 是JDK的核心类库中的写好的,不要我们自己写,直接导进来就行了

00013.02常用接口:java.util.Comparator_ide_23


00013.02常用接口:java.util.Comparator_java_24


00013.02常用接口:java.util.Comparator_System_25


至此写完了吗?但是大家注意,我们现在只是写了算法,你知道将来这个算法用来比较什么的吗?实际上不知道

那我们新建一个测试类来使用它

00013.02常用接口:java.util.Comparator_java_26


00013.02常用接口:java.util.Comparator_System_27

怎么用呢?首先得有一个数组

00013.02常用接口:java.util.Comparator_ide_28


00013.02常用接口:java.util.Comparator_System_29


00013.02常用接口:java.util.Comparator_System_30

00013.02常用接口:java.util.Comparator_java_31


为了直观,加几行代码如下:

00013.02常用接口:java.util.Comparator_ide_32


00013.02常用接口:java.util.Comparator_java_33


00013.02常用接口:java.util.Comparator_System_34

00013.02常用接口:java.util.Comparator_System_35


运行效果如下:

00013.02常用接口:java.util.Comparator_System_36


完整代码:

结构如下:

00013.02常用接口:java.util.Comparator_System_37


TestComparator2类:

package com.atguigu.test04;

import com.atguigu.test04.Student;

public class TestComparator2 {
//需求:编写一个MyArrays的数组工具类,这个工具类,想要为任意的对象数组,进行升序排序
public static void main(String[] args) {
Student [] all =new Student[5];
all[0]=new Student("刘一",20,80);
all[1]=new Student("陈二",23,99);
all[2]=new Student("张三",25,70);
all[3]=new Student("李四",23,70);
all[4]=new Student("张三",26,70);

AgeComparator c = new AgeComparator();
MyArrays.sort(all, c);

System.out.println("-------------------------");
for (int i = 0; i < all.length; i++) {
System.out.println(all[i]);//打印对象
}
}
}

Student:

package com.atguigu.test04;

class Student{
//属性
private String name;
private int age;
private int score;
//构造器
public Student() {
super();
}
public Student(String name, int age, int score) {
super();
this.name = name;
this.age = age;
this.score = score;
}
//get/set
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
//重写toString()
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", score=" + score + "]";
}
}

MyArrays类

package com.atguigu.test04;

import java.util.Comparator;
//需求:编写一个MyArrays的数组工具类,这个工具类,想要为任意的对象数组,进行升序排序
public class MyArrays {
//这只是算法,怎么使用?具体到底是比较什么
public static void sort(Object[] arr,Comparator c){
for(int i= 1;i < arr.length; i++){
System.out.println("第"+i+"轮");
for (int j = 0; j < arr.length-i; j++) {
//为了更直观
System.out.println("比较:arr["+j+"]和arr["+(j+1)+"]");
System.out.println(arr[j]);
System.out.println(arr[j+1]);

//这里是冒泡排序法,记死的也行
//if (arr[j]>arr[j+1])
if (c.compare(arr[j], arr[j+1])>0) {
Object temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
}

AgeComparator类:

package com.atguigu.test04;

import java.util.Comparator;
//需求:编写一个MyArrays的数组工具类,这个工具类,想要为任意的对象数组,进行升序排序
public class MyArrays {
//这只是算法,怎么使用?具体到底是比较什么
public static void sort(Object[] arr,Comparator c){
for(int i= 1;i < arr.length; i++){
System.out.println("第"+i+"轮");
for (int j = 0; j < arr.length-i; j++) {
//为了更直观
System.out.println("比较:arr["+j+"]和arr["+(j+1)+"]");
System.out.println(arr[j]);
System.out.println(arr[j+1]);

//这里是冒泡排序法,记死的也行
//if (arr[j]>arr[j+1])
if (c.compare(arr[j], arr[j+1])>0) {
Object temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
}
}

三、最后图解

00013.02常用接口:java.util.Comparator_java_38


举报

相关推荐

0 条评论