Java比较器

比较器有两种:Comparable接口与Comparator接口,用于对象之间的比较

1:Comparable接口:称为自然排序,String类,包装类都继承了此接口,且实现了CompareTo方法

使用:对于自定义类对象所属的类首先需要实现Comparable接口,其次实现其中的CompareTo(Object obj)方法,最后重写所在类的toString方法,因为数组的遍历需要调用Arrays.toString(arr[]);

对于compareTo方法重写的规则:当前对象this大于形参obj返回值为正整数,小于返回值为负整数,等于时为0,然后抛出运行异常

2:Comparator接口:称为定制排序,还未完全理解

 1 /**
 2  * java比较器
 3  * 说明:Java中的对象正常情况下只能进行比较:==或!=不能使用<或>的
 4  * 但是在开发当中,我们需要对多个对象进行排序,需要对对象比较大小,
 5  * 使用两个接口中的任何一个,Comparable或Comparator
 6  * 一:Comparable接口的使用:自然排序
 7  * 二:Comparator接口的使用:定制排序,自己设置排序的方式,从低往高,等等
 8  *
 9  */
10 public class CompareTest {
11     /**
12      *Comparable接口的使用:    自然排序
13      * 1:String,包装类都实现了Comparable接口,重写了compareTo方法,给出了比较两个对象大小的方法:
14      * 2:像String,包装类重写compareTo方法后,进行了从小到大的排序
15      * 3:重写compareTo(obj)方法的规则:
16      *   如果当前对象this大于形参obj,返回正整数
17      *   如果当前对象this小于形参obj,返回负整数
18      *   如果当前对象this等于形参obj,返回0
19      * 4:对于自定义类:如果需要排序,可以让自定义类实现Comparable接口,重写compareTo方法,
20      *   再compareTo方法中说明如何排序,记得重写toString方法,因为如果是存在数组里面会调用sort方法先进行排序
21      *   之后因为是数组,所以遍历需要调用Array.toString方法,所以必须重写toString方法
22      *
23      *
24      */
25 
26     @Test
27     public void test(){
28         String[] arr=new String[]{"aa","bb","dd","hh","ee","cc"} ;
29         Arrays.sort(arr);
30         System.out.println(Arrays.toString(arr));
31         //自定义类students
32         Students students1=new Students(23,"张三");
33         Students students2=new Students(19,"李四");
34         Students students3=new Students(19,"黄鹏鹏");
35         Students students4=new Students(30,"奥巴马");
36         Students[]array=new Students[]{students1,students2,students3,students4};
37         Arrays.sort(array);
38         System.out.println(Arrays.toString(array));
39     }
40 
41     /**
42      * Comparator接口:定制排序
43      * Comparator接口的使用背景:当元素的类未实现Comparable接口或者Comparable接口提供的排序不符合要求时
44      * 可以考虑使用Comparator接口进行定制排序
45      * 1:
46      *
47      *
48      */
49     @Test
50     public void test2(){
51         Students students1=new Students(23,"黄鹏鹏");
52         Students students2=new Students(19,"艾四");
53         Students students3=new Students(19,"黄鹏鹏");
54         Students students4=new Students(30,"奥巴马");
55         Students[]array=new Students[]{students1,students2,students3,students4};
56         Arrays.sort(array);
57         System.out.println(Arrays.toString(array));
58     }
59 }

 **********************************************************

 1 public class Students implements Comparable,Comparator {
 2     private int age;
 3     private String name;
 4 
 5     @Override
 6     public String toString() {
 7         return this.age+this.name;
 8     }
 9 
10     public Students(int age, String name) {
11         this.age = age;
12         this.name = name;
13     }
14 
15     public int getAge() {
16         return age;
17     }
18 
19     public void setAge(int age) {
20         this.age = age;
21     }
22 
23     public String getName() {
24         return name;
25     }
26 
27     public void setName(String name) {
28         this.name = name;
29     }
30    //重写compareTo方法,指明按照什么方式排序
31     @Override
32     public int compareTo(Object o) {
33         if (o instanceof Students){
34             Students students=(Students) o;//将传进来的形参o进行强转
35             if (this.age>students.age){//价格从低到高排序
36                 return 1;
37             }else if (this.age<students.age){
38                 return -1;
39             }else {
40                 return -this.name.compareTo(students.name);
41                 //如果年龄相等,按照name进行排序,"-"表示从低到高
42             }
43         }
44         throw new RuntimeException("传入的数据类型不匹配");//返回值可以设置为抛出运行时异常
45     }
46 
47     @Override
48     public int compare(Object o1, Object o2) {
49         if (o1 instanceof Students&& o2 instanceof Students){
50             Students students1=(Students) o1;//进行强转
51             Students students2=(Students) o2;
52             if (students1.name.equals(students2.name)){
53                 return compare(students1.age,students2.age);
54             }else {
55                 return compare(students1.name,students2.name);
56             }
57         }
58         throw new RuntimeException("输入的数据类型错误");
59     }
60 }

 

posted @ 2021-11-04 19:03  tiiiiii  阅读(150)  评论(0)    收藏  举报