码迷,mamicode.com
首页 > 编程语言 > 详细

java比较器

时间:2017-12-17 23:58:53      阅读:354      评论:0      收藏:0      [点我收藏+]

标签:private   实体类   double   实现   hid   es2017   break   tun   test   

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("\n排序后:");
21         for(Student student:stu){
22             System.out.println(student.toString());
23         }
24     }
25 }
View Code

④ 测试结果:

 技术分享图片

 

java比较器

标签:private   实体类   double   实现   hid   es2017   break   tun   test   

原文地址:http://www.cnblogs.com/superdrew/p/8053482.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!