• Java_接口使用实例


    目录

    给对象数组排序  

    按年龄来比较:

    按名字来比较:

    尝试自己实现一个 sort 方法


    给对象数组排序  

    1. class Student {
    2. public String name;
    3. public int age;
    4. public int score;
    5. public Student(String name, int age, int score) {
    6. this.name = name;
    7. this.age = age;
    8. this.score = score;
    9. }
    10. @Override
    11. public String toString() {
    12. return "Student{" +
    13. "name='" + name + '\'' +
    14. ", age=" + age +
    15. ", score=" + score +
    16. '}';
    17. }
    18. }
    19. public class Test {
    20. public static void main(String[] args) {
    21. Student[] students = new Student[3];
    22. students[0] = new Student("b",19,60);
    23. students[1] = new Student("c",17,90);
    24. students[2] = new Student("a",18,80);
    25. //Arrays.sort(students);错误
    26. }
    27. }

    按照我们之前的理解, 数组我们有一个现成的 sort 方法, 能否直接使用这个方法呢?

    答案是不能的,因为和普通的整数不一样, 两个整数是可以直接比较的, 大小关系明确. 而两个学生对象的大小关系怎么确定? 这需要我们额外指定。

    让我们的 Student 类实现 Comparable 接口, 并实现其中的 compareTo 方法:

    按年龄来比较:

     

    1. class Student implements Comparable {
    2. public String name;
    3. public int age;
    4. public int score;
    5. public Student(String name, int age, int score) {
    6. this.name = name;
    7. this.age = age;
    8. this.score = score;
    9. }
    10. @Override
    11. public String toString() {
    12. return "Student{" +
    13. "name='" + name + '\'' +
    14. ", age=" + age +
    15. ", score=" + score +
    16. '}';
    17. }
    18. @Override
    19. public int compareTo(Student o) {
    20. //写比较规则
    21. if (this.age > o.age) {
    22. return 1;
    23. }else if (this.age < o.age){
    24. return -1;
    25. }else {
    26. return 0;
    27. }
    28. }
    29. }
    30. public class Test {
    31. public static void main(String[] args) {
    32. Student[] students = new Student[3];
    33. students[0] = new Student("b",19,60);
    34. students[1] = new Student("c",17,90);
    35. students[2] = new Student("a",18,80);
    36. students[0].compareTo(students[1]);
    37. //规则:0下标比1下标大,返回正数,0下标比1小,返回负数,0下标和1下标相等,返回0
    38. Arrays.sort(students);
    39. System.out.println(Arrays.toString(students));
    40. }
    41. }

    sort 方法中会自动调用 compareTo 方法。compareTo 的参数是 Object , 其实传入的就是 Student 类型的对象。然后比较当前对象和参数对象的大小关系(按年龄来算)。如果当前对象应排在参数对象之前, 返回小于 0 的数字; 如果当前对象应排在参数对象之后, 返回大于 0 的数字; 如果当前对象和参数对象不分先后, 返回 0; 再次执行程序, 结果就符合预期了。

    注意事项: 对于 sort 方法来说, 需要传入的数组的每个对象都是 "可比较" 的, 需要具备 compareTo 这样的能力. 通 过重写 compareTo 方法的方式, 就可以定义比较规则。

    按名字来比较:

    1. class Student implements Comparable {
    2. public String name;
    3. public int age;
    4. public int score;
    5. public Student(String name, int age, int score) {
    6. this.name = name;
    7. this.age = age;
    8. this.score = score;
    9. }
    10. @Override
    11. public String toString() {
    12. return "Student{" +
    13. "name='" + name + '\'' +
    14. ", age=" + age +
    15. ", score=" + score +
    16. '}';
    17. }
    18. /*@Override
    19. public int compareTo(Student o) {
    20. //写比较规则:按年龄比较
    21. if (this.age > o.age) {
    22. return 1;
    23. }else if (this.age < o.age){
    24. return -1;
    25. }else {
    26. return 0;
    27. }
    28. }*/
    29. @Override
    30. public int compareTo(Student o) {
    31. //写比较规则:按名字比较
    32. //调用name的compareTo()(即String类型的compareTo())
    33. if (this.name.compareTo(o.name) > 0) {
    34. return 1;
    35. }else if (this.name.compareTo(o.name) < 0){
    36. return -1;
    37. }else {
    38. return 0;
    39. }
    40. }
    41. }
    42. public class Test {
    43. public static void main(String[] args) {
    44. Student[] students = new Student[3];
    45. students[0] = new Student("b",19,60);
    46. students[1] = new Student("c",17,90);
    47. students[2] = new Student("a",18,80);
    48. students[0].compareTo(students[1]);
    49. //规则:0下标比1下标大,返回正数,0下标比1小,返回负数,0下标和1下标相等,返回0
    50. Arrays.sort(students);
    51. System.out.println(Arrays.toString(students));
    52. }
    53. }

     运行结果是:

    尝试自己实现一个 sort 方法

    为了进一步加深对接口的理解, 我们可以尝试自己实现一个 sort 方法来完成刚才的排序过程(使用冒泡排序)

    1. public class Test {
    2. public static void sort(Comparable[] array) {
    3. for (int i = 0; i < array.length - 1; i++) {
    4. for (int j = 0; j < array.length-1-i; j++) {
    5. //交换
    6. if (array[j].compareTo(array[j+1]) > 0) {
    7. Comparable tmp = array[j];
    8. array[j] = array[j+1];
    9. array[j+1] = tmp;
    10. }
    11. }
    12. }
    13. }
    14. public static void main(String[] args) {
    15. Student[] students = new Student[3];
    16. students[0] = new Student("b",19,60);
    17. students[1] = new Student("c",17,90);
    18. students[2] = new Student("a",18,80);
    19. sort(students);//调用自己写的sort方法
    20. System.out.println(Arrays.toString(students));
    21. students[0].compareTo(students[1]);
    22. //规则:0下标比1下标大,返回正数,0下标比1小,返回负数,0下标和1下标相等,返回0
    23. Arrays.sort(students);
    24. System.out.println(Arrays.toString(students));
    25. }
    26. }

  • 相关阅读:
    【Leetcode】573. Squirrel Simulation
    Spring Cloud Alibaba-OpenFign实现服务调用
    application3个文件的区分
    ke9案例三:页面提交文件,我服务器端接收
    关于Mac配置逆向工程
    SveletJs学习——简介模块
    【附源码】Python计算机毕业设计美食推荐系统
    SwaggerSpy:一款针对SwaggerHub的自动化OSINT安全工具
    关于IDEA工具的一些简单的设置以及快捷键
    JSX基础语法
  • 原文地址:https://blog.csdn.net/m0_68071216/article/details/128057409