【Java】通过Comparator比较器的方式给对象数组排序

简介: 【Java】通过Comparator比较器的方式给对象数组排序

上篇文章我们学习了通过重写compareTo()方法给对象数组排序(链接:http://t.csdn.cn/i5GfS)可是这种方法也有缺点,就是不太灵活,太固定了。如果我们学生类不实现comparable接口能不能做到非常灵活的实现排序呢?我们还有另一种方法:比较器

我们定义另一个类实现另一个接口,然后实现里面的抽象方法。



然后我们可以看到 Arrays.sort()源码中有这样一个方法:



这个方法可以传两个参数。又因为我们的AgeComparator实现了 Comparator接口,那我们就可以这样写一个比较器作为第二个参数:



这样我们就可以完成对年龄的排序:



我们会发现现在是单独的一个类,不会对Student类进行修改 。

同样我们可以再实现几个,比如成绩的比较器:


这样就是实现了对成绩排序。

本篇完整代码:

package csdn;
 
import java.util.Arrays;
import java.util.Comparator;
 
class  Student  {
    public  String name;
    public  int age;
    public  int score;
    public Student(String name, int age, int score) {
        this.name = name;
        this.age = age;
        this.score = score;
    }
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", score=" + score +
                '}';
    }
 
 
}
class  AgeComparator implements Comparator<Student>{
    @Override
    public int compare(Student o1, Student o2) {
        return o1.age-o2.age;
    }
}
class  ScoreComparator implements Comparator<Student>{
    @Override
    public int compare(Student o1, Student o2) {
        return o1.score-o2.score;
    }
}
public class test {
    public static void main(String[] args) {
        Student[] students=new Student[4];
        students[0]=new Student("zhangsan",10,19);
        students[1]=new Student("lisi",8,78);
        students[2]=new Student("wangwu",15,57);
        students[3]=new Student("zhaoliu",11,57);
        AgeComparator ageComparator=new AgeComparator(); //比较器
        Arrays.sort(students,ageComparator);//按年龄排
        ScoreComparator scoreComparator=new ScoreComparator(); //比较器
        Arrays.sort(students,scoreComparator);//按成绩排
}
}

 

目录
相关文章
|
4天前
|
缓存 前端开发 Java
【前端学java】复习巩固-Java中的对象比较(15)
【8月更文挑战第11天】Java中的对象比较
13 1
【前端学java】复习巩固-Java中的对象比较(15)
|
11天前
|
存储 Java 程序员
Java中对象几种类型的内存分配(JVM对象储存机制)
Java中对象几种类型的内存分配(JVM对象储存机制)
45 5
Java中对象几种类型的内存分配(JVM对象储存机制)
|
3天前
|
Java API 开发者
|
2天前
|
存储 设计模式 Java
在 Java 中创建多个对象
【8月更文挑战第17天】
6 0
|
4天前
|
Java Spring 容器
Java SpringBoot 中,动态执行 bean 对象中的方法
Java SpringBoot 中,动态执行 bean 对象中的方法
14 0
|
4天前
|
Java
Java Bean 注册对象
Java Bean 注册对象
6 0
|
11天前
|
设计模式 存储 安全
18 Java反射reflect(类加载+获取类对象+通用操作+设计模式+枚举+注解)
18 Java反射reflect(类加载+获取类对象+通用操作+设计模式+枚举+注解)
39 0
|
6天前
|
Java 开发者
奇迹时刻!探索 Java 多线程的奇幻之旅:Thread 类和 Runnable 接口的惊人对决
【8月更文挑战第13天】Java的多线程特性能显著提升程序性能与响应性。本文通过示例代码详细解析了两种核心实现方式:Thread类与Runnable接口。Thread类适用于简单场景,直接定义线程行为;Runnable接口则更适合复杂的项目结构,尤其在需要继承其他类时,能保持代码的清晰与模块化。理解两者差异有助于开发者在实际应用中做出合理选择,构建高效稳定的多线程程序。
27 7
|
5天前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
5天前
|
存储 监控 安全
一天十道Java面试题----第三天(对线程安全的理解------>线程池中阻塞队列的作用)
这篇文章是Java面试第三天的笔记,讨论了线程安全、Thread与Runnable的区别、守护线程、ThreadLocal原理及内存泄漏问题、并发并行串行的概念、并发三大特性、线程池的使用原因和解释、线程池处理流程,以及线程池中阻塞队列的作用和设计考虑。