【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);//按成绩排
}
}

 

目录
相关文章
|
1月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
50 17
|
1月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
2月前
|
存储 Java 数据管理
Java零基础-Java对象详解
【10月更文挑战第7天】Java零基础教学篇,手把手实践教学!
31 6
|
2月前
|
Oracle Java 关系型数据库
重新定义 Java 对象相等性
本文探讨了Java中的对象相等性问题,包括自反性、对称性、传递性和一致性等原则,并通过LaptopCharger类的例子展示了引用相等与内容相等的区别。文章还介绍了如何通过重写`equals`方法和使用`Comparator`接口来实现更复杂的相等度量,以满足特定的业务需求。
29 3
|
1月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
42 0
|
2月前
|
存储 前端开发 Java
你还没有对象吗?java带你创建一个吧
你还没有对象吗?java带你创建一个吧
14 0
Java学习路线-23:比较器Comparable、Comparator、二叉树
Java学习路线-23:比较器Comparable、Comparator、二叉树
|
5天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
35 6
|
20天前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####