• java比较器


    java 实体类的比较器:

    1.内部比较器:

     1 package test.comparable;
     2 
     3 public class Student implements Comparable {
     4     private String name;
     5     private double score;
     6     private int age;
     7 
     8     public int compareTo(Object obj){
     9         Student stu = (Student)obj;
    10         return this.name.compareTo(stu.name);
    11     }
    12     
    13     
    14     public String getName() {
    15         return name;
    16     }
    17     public void setName(String name) {
    18         this.name = name;
    19     }
    20     public double getScore() {
    21         return score;
    22     }
    23     public void setScore(double score) {
    24         this.score = score;
    25     }
    26     public int getAge() {
    27         return age;
    28     }
    29     public void setAge(int age) {
    30         this.age = age;
    31     }
    32     public Student(String name, double score, int age) {
    33         super();
    34         this.name = name;
    35         this.score = score;
    36         this.age = age;
    37     }
    38     
    39     public Student() {
    40         super();
    41     }
    42     
    43     public String toString() {
    44         return "Student [name=" + name + ", score=" + score + ", age=" + age + "]";
    45     }
    46     
    47     
    48     public boolean equals(Object obj) {
    49         if (this == obj)
    50             return true;
    51         if (obj == null)
    52             return false;
    53         if (getClass() != obj.getClass())
    54             return false;
    55         Student other = (Student) obj;
    56         if (age != other.age)
    57             return false;
    58         if (name == null) {
    59             if (other.name != null)
    60                 return false;
    61         } else if (!name.equals(other.name))
    62             return false;
    63         if (Double.doubleToLongBits(score) != Double.doubleToLongBits(other.score))
    64             return false;
    65         return true;
    66     }
    67     
    68 }
    View Code

     2. 外部比较器:

    准备工作:建立一个排序的工具类:

     1 package test.comparable;
     2 /**
     3  * 数组的工具类
     4  * @author Drew
     5  *
     6  */
     7 public class ArrayUtils {
     8     //改成对象数组的参数
     9     public static void sort(Object [] arr){
    10         Object temp;
    11         int i;
    12         boolean flag = true;//标志位,判断数组是否有序  默认是有序的
    13         //3.1大循环,N个元素排序,最多经过N-1次循环比较
    14         for(i=0;i<arr.length-1;i++){
    15             //3.2小循环 每一趟循环 都是从第一个开始,两个元素进行比较  比较到最后
    16             for(int j=0;j<arr.length-i-1;j++){
    17                 //交换   如果前面的数比后一个数大,交换位置
    18                 //if(arr[j].equals(arr[j+1]) ){
    19                 //肯定是要强转   怎么转  转谁 ?
    20                 //因为子类实现了 Comparable
    21                 Comparable comp1 = (Comparable)arr[j];
    22                 Comparable comp2 = (Comparable)arr[j+1];
    23                 //if((arr[j].compareTo(arr[j+1]))>0){
    24                 if( comp1.compareTo(comp2) > 0){
    25                     temp = arr[j];  //获取数组下标的元素内容
    26                     arr[j] = arr[j+1];
    27                     arr[j+1] = temp;
    28                     flag = false;
    29                 }
    30             }
    31             if(flag){
    32                 break;
    33             }
    34         }
    35     }
    36     
    37     //优化后的比较方法  把比的能力的父类 接口 做形参
    38     public static void sort(Comparable [] arr){
    39         Comparable temp;
    40         int i;
    41         boolean flag = true;//标志位,判断数组是否有序  默认是有序的
    42         //3.1大循环,N个元素排序,最多经过N-1次循环比较
    43         for(i=0;i<arr.length-1;i++){
    44             //3.2小循环 每一趟循环 都是从第一个开始,两个元素进行比较  比较到最后
    45             for(int j=0;j<arr.length-i-1;j++){
    46                 //交换   如果前面的数比后一个数大,交换位置
    47                 //if(arr[j].equals(arr[j+1]) ){
    48                 //肯定是要强转   怎么转  转谁 ?
    49                 //因为子类实现了 Comparable
    50                 //Comparable comp1 = (Comparable)arr[j];
    51                 //Comparable comp2 = (Comparable)arr[j+1];
    52                 //if((arr[j].compareTo(arr[j+1]))>0){
    53                 if( arr[j].compareTo(arr[j+1]) > 0){
    54                     temp = arr[j];  //获取数组下标的元素内容
    55                     arr[j] = arr[j+1];
    56                     arr[j+1] = temp;
    57                     flag = false;
    58                 }
    59             }
    60             if(flag){
    61                 break;
    62             }
    63         }
    64     }
    65     
    66     /**
    67      * 
    68      * @param arr            数据       
    69      * @param comparator  规则 
    70      */
    71     public static void sort(Object [] arr,Comparator comparator){
    72         Object temp;
    73         int i;
    74         boolean flag = true;//标志位,判断数组是否有序  默认是有序的
    75         //3.1大循环,N个元素排序,最多经过N-1次循环比较
    76         for(i=0;i<arr.length-1;i++){
    77             //3.2小循环 每一趟循环 都是从第一个开始,两个元素进行比较  比较到最后
    78             for(int j=0;j<arr.length-i-1;j++){
    79                 //交换   如果前面的数比后一个数大,交换位置
    80                 //if(arr[j].equals(arr[j+1]) ){
    81                 //肯定是要强转   怎么转  转谁 ?
    82                 //因为子类实现了 Comparable
    83                 //Comparable comp1 = (Comparable)arr[j];
    84                 //Comparable comp2 = (Comparable)arr[j+1];
    85                 //if((arr[j].compareTo(arr[j+1]))>0){
    86                 if( comparator.compareTo(arr[j], arr[j+1]) >0){
    87                     temp = arr[j];  //获取数组下标的元素内容
    88                     arr[j] = arr[j+1];
    89                     arr[j+1] = temp;
    90                     flag = false;
    91                 }
    92             }
    93             if(flag){
    94                 break;
    95             }
    96         }
    97     }
    98 }
    View Code

    ① 定义比较器的整体:

     1 package test.comparable;
     2 
     3 /**
     4  * 按照规则来比较
     5  * @author Administrator
     6  *
     7  */
     8 public interface Comparator {
     9     
    10     /**
    11      * 比较的能力
    12      * @param obj  数据1
    13      * @param obj2  数据2
    14      * @return    1  -1  0
    15      */
    16     public int compareTo(Object obj,Object obj2);
    17 }
    View Code

    ② 定义比较器的比较规则,即按照什么来比较的。是按照学生的学号,还是学生的姓名等等来排序的。这就是比较器需要做的。

    按照学生姓名比较排序的外部比较器,提醒:姓名是String类型的。

     1 package test.comparable;
     2 
     3 public class StuNameComparator implements Comparator{
     4 
     5     @Override
     6     public int compareTo(Object obj, Object obj2) {
     7         Student stu1 = (Student)obj;
     8         Student stu2 = (Student)obj2;
     9         return stu1.getName().compareTo(stu2.getName());
    10     }
    11     
    12 }
    View Code

    按照学生年龄比较排序的外部比较器,提醒:年龄是int类型的。

     1 package test.comparable;
     2 
     3 public class StuAgeComparator implements Comparator{
     4     
     5     /**
     6      * 比较的规则
     7      */
     8     public int compareTo(Object obj, Object obj2) {
     9         
    10         Student stu1 = (Student)obj;
    11         Student stu2 = (Student)obj2;
    12         return stu1.getAge() - stu2.getAge();
    13     }
    14     
    15 }
    View Code

    ③ 测试类:

     1 package test.comparable;
     2 
     3 public class TestArr2 {
     4     public static void main(String[] args) {
     5         Student [] stu = new Student [4];
     6         stu[0] = new Student("d", 78, 18);
     7         stu[1] = new Student("a", 70, 20);
     8         stu[2] = new Student("z", 99.8, 38);
     9         stu[3] = new Student("c", 99.5, 17);
    10         
    11         System.out.println("排序前:");
    12         for(Student student:stu){
    13             System.out.println(student.toString());
    14         }
    15         //先按照学生的年龄排序,在接着按照学生的姓名排序。
    16         StuAgeComparator stuAge = new StuAgeComparator();
    17         StuNameComparator stuName = new StuNameComparator();
    18         ArrayUtils.sort(stu, stuName);
    19         
    20         System.out.println("
    排序后:");
    21         for(Student student:stu){
    22             System.out.println(student.toString());
    23         }
    24     }
    25 }
    View Code

    ④ 测试结果:

     

  • 相关阅读:
    WebStorm 常用功能的使用技巧分享
    Android开发-之数据的存储方式一
    C#泛型方法解析
    Vuex2.0+Vue2.0构建备忘录应用实践
    Android Studio快速开发之道
    深入jQuery中的data()
    Django---->模板层(template)
    初识DJango——MTV模型
    初识DJango——Web框架
    Offcanvas 自适应窗口示例
  • 原文地址:https://www.cnblogs.com/superdrew/p/8053482.html
Copyright © 2020-2023  润新知