• Java中Comparable接口的使用,匿名内部类的调用


    一、代码分析

    共三个类。

    1、Employee类

    2、ArrayTools类

    3、TestAnonymousInnerUse类


    (一)Employee类

    1、代码分析:

    (1)实现(implements)接口 Comparable

    实现接口,需重写接口的抽象方法。

    (2)成员属性

    ①编号(id)

    ②姓名(name)

    ③薪资(saraly)

    ③年龄(age)

    (3)构造器:

    有参的构造器:public Employee(int id, String name, Double saraly, int age)

    使用“Alt+Insert”快捷键,点击"Constructor",生成有参的构造器。

    (4)成员方法:

    ①Getter和Setter方法:可使用“Alt+Insert”快捷键快速生成。

    ②重写父类“Object”(一般类默认的父类)的“toString”方法。可使用“Alt+Insert”快捷键,找到“toString”方法快速生成。public String toString()

    ③重写接口的方法:public int compareTo(Object o)

    重写接口方法,可使用“Ctrl + I”快捷键快速生成。


    1. //2022.7.28
    2. public class Employee implements Comparable{
    3. //成员属性
    4. private int id;
    5. private String name;
    6. private Double saraly;
    7. private int age;
    8. //构造器
    9. public Employee(int id, String name, Double saraly, int age) {
    10. this.id = id;
    11. this.name = name;
    12. this.saraly = saraly;
    13. this.age = age;
    14. }
    15. //getter和setter方法
    16. public int getId() {
    17. return id;
    18. }
    19. public void setId(int id) {
    20. this.id = id;
    21. }
    22. public String getName() {
    23. return name;
    24. }
    25. public void setName(String name) {
    26. this.name = name;
    27. }
    28. public Double getSaraly() {
    29. return saraly;
    30. }
    31. public void setSaraly(Double saraly) {
    32. this.saraly = saraly;
    33. }
    34. public int getAge() {
    35. return age;
    36. }
    37. public void setAge(int age) {
    38. this.age = age;
    39. }
    40. //重写toString方法、
    41. @Override
    42. public String toString() {
    43. return "Employee{" +
    44. "id=" + id +
    45. ", name='" + name + '\'' +
    46. ", saraly=" + saraly +
    47. ", age=" + age +
    48. '}';
    49. }
    50. //需要重写CompareTo方法
    51. @Override
    52. public int compareTo(Object o) {
    53. return this.id-((Employee)o).id;
    54. }
    55. }

    (二)ArrayTools类

    1、实现的方法:

    (1)自然排序:public static void sort(Object[] arr)   使用了冒泡排序

    (2)定制排序:public static void sort(Object[] arr, Comparator c)

    (3)打印输出:public static void print(Object[] arr)


    1. //2022.7.28
    2. import java.util.Comparator;
    3. public class ArrayTools {
    4. //自然排序
    5. public static void sort(Object[] arr) {
    6. //进行冒泡排序
    7. for (int i = 1; i < arr.length; i++) {
    8. for (int j = 0; j < arr.length - i; j++) {
    9. Comparable left = (Comparable) arr[j];
    10. if (left.compareTo(arr[j + 1]) > 0) {
    11. Object temp = arr[j];
    12. arr[j] = arr[j + 1];
    13. arr[j + 1] = temp;
    14. }
    15. }
    16. }
    17. }
    18. //定制排序
    19. public static void sort(Object[] arr, Comparator c) {
    20. //进行冒泡排序
    21. for (int i = 1; i < arr.length; i++) {
    22. for (int j = 0; j < arr.length - i; j++) {
    23. if (c.compare(arr[j], arr[j + 1]) > 0) {
    24. Object temp = arr[j];
    25. arr[j] = arr[j + 1];
    26. arr[j + 1] = temp;
    27. }
    28. }
    29. }
    30. }
    31. //打印
    32. public static void print(Object[] arr) {
    33. for (int i = 0; i < arr.length; i++) {
    34. System.out.println(arr[i]);
    35. }
    36. }
    37. }

    (三)TestAnonymousInnerUse类

    1、该类为测试类,是主程序的入口。

    2、在此类中创建了Employee类的对象数组,对5个数组对象分别按照“编号从小到大排序”、“编号从大到小排序”、“薪资从大到小排序”、“年龄从大到小排序”。

    3、在后面三个的排序中对“Comparator接口”使用了“匿名内部类”方法。

    重写接口方法时,使用了“向下转型”,将Object类的对象转型为Employee类进行属性的比较。


    1. //2022.7.28
    2. import java.util.Comparator;
    3. public class TestAnonymousInnerUse {
    4. public static void main(String[] args) {
    5. //创建Employee类的对象数组,存5个对象
    6. Employee[] arr = new Employee[5];
    7. arr[0] = new Employee(1,"张三",15000.0,23);
    8. arr[1] = new Employee(3,"李四",16000.0,23);
    9. arr[2] = new Employee(5,"王五",12000.0,26);
    10. arr[3] = new Employee(4,"赵六",17000.0,21);
    11. arr[4] = new Employee(2,"钱七",13000.0,22);
    12. //按照员工的编号进行排序
    13. System.out.println("按照编号从小到大排序:");
    14. ArrayTools.sort(arr);
    15. ArrayTools.print(arr);
    16. System.out.println("按照编号从大到小排序:");
    17. //使用匿名内部类
    18. ArrayTools.sort(arr, new Comparator() {
    19. @Override
    20. public int compare(Object o, Object t1) {
    21. Employee e1 = (Employee)o;
    22. Employee e2 = (Employee)t1;
    23. return e2.getId() - e1.getId();
    24. }
    25. });
    26. ArrayTools.print(arr);
    27. System.out.println("按照薪资从大到小排序:");
    28. ArrayTools.sort(arr, new Comparator() {
    29. @Override
    30. public int compare(Object o, Object t1) {
    31. Employee e1 = (Employee)o;
    32. Employee e2 = (Employee)t1;
    33. return Double.compare(e2.getSaraly(),e1.getSaraly());
    34. }
    35. });
    36. ArrayTools.print(arr);
    37. System.out.println("按照年龄从大到小排序:");
    38. ArrayTools.sort(arr, new Comparator() {
    39. @Override
    40. public int compare(Object o, Object t1) {
    41. Employee e1 = (Employee) o;
    42. Employee e2 = (Employee) t1;
    43. return e2.getAge() - e1.getAge();
    44. }
    45. });
    46. ArrayTools.print(arr);
    47. }
    48. }

    三、测试代码

    验证结果实现测试要求,测试OK,代码可行。 

  • 相关阅读:
    Java学习笔记 --- Java绘图技术
    【ABAP】SAP发送消息至RabbitMQ
    如何准确且可解释地评估大模型量化效果?
    QT五子棋
    产品补丁包测试的基本流程
    数据在内存中的存储
    Linux深度学习:除基本命令操作外的实用操作
    深入了解Golang:基本语法与核心特性解析
    【HTML】播放器如何自动播放【已解决】
    37 深度学习(一):查看自己显卡的指令|张量|验证集|分类问题|回归问题
  • 原文地址:https://blog.csdn.net/weixin_51733609/article/details/126041397