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 }
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 }
① 定义比较器的整体:
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 }
② 定义比较器的比较规则,即按照什么来比较的。是按照学生的学号,还是学生的姓名等等来排序的。这就是比较器需要做的。
按照学生姓名比较排序的外部比较器,提醒:姓名是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 }
按照学生年龄比较排序的外部比较器,提醒:年龄是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 }
③ 测试类:
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 }
④ 测试结果: