comparable接口

Posted ljl150

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了comparable接口相关的知识,希望对你有一定的参考价值。

         在java中,当要对两个对象进行比较时,因为对象一般都拥有较多的属性,java编译器(jdk)也不知道用户所要进行比较的是什么,id?name?

所对于对象的比较,一般都要给对象类实现comparable接口(不是继承对象,是因为在底层comparable()是被写成接口的),因为comparable接口

是泛型接口,且要比较的两个对象是Student类,所以要在尖括号中将类型参数写成Student类,然后还要注意的是在comparable接口中,compareTo()方法

是抽象方法,所以当对象实现了comparable接口后,还要对compareTo()方法进行重写(点击类实现后面的comparable,Alt+enter)。

技术图片

 

 

 技术图片

 

 

   代码实现:

 1 package L14;
 2 import java.util.Arrays;
 3 class StudentText implements Comparable<StudentText>{
 4     private int id;
 5     private String name;
 6     public StudentText(int id,String name){
 7         this.id=id;
 8         this.name=name;
 9     }
10     public String getName() {
11         return name;
12     }
13     @Override
14     public int compareTo(StudentText o){
15         return this.id >o.id?1:(this.id==o.id?0:-1);
16     }
17     @Override
18     public String toString(){   //重写tostring
19         String str="id:"+id+"name:"+name;
20         return str;
21     }
22 
23 }
24 public class Student {
25     public static void main(String[] args) {
26         StudentText[] stu=new StudentText[3];
27         stu[0]=new StudentText(101,"lisi");
28         stu[1]=new StudentText(100,"zhangsan");
29         stu[2]=new StudentText(102,"wangwu");
30         System.out.println(Arrays.toString(stu));    //将数组中的各个元素打印出来
31         /**
32          * void sort(Object[]  arr)
33          * {
34          *   if(arr[i] instanceOf Cmparable)
35          *   {
36          *     Comparable obj=(Comparable)arr;
37          *     obj.compareTo(xx)
38          *   }
39          */
40         Arrays.sort(stu);   //对数组中元素进行排序
41         System.out.println(Arrays.toString(stu));
42 
43 
44     }
45 }

运行结果:

技术图片

 

 分析:1.之所以可以用sort()方法进行排序。是因为sort()方法在底层进行了如下判断。所以要对对象进行比较时,要先给对象实现comparable接口。

     否则无法使用sort()方法。

    /**
                * void sort(Object[] arr)

               * {

       * if(arr[i] instanceOf Cmparable)   //即数组实现了Comparable接口

     * {

     * Comparable obj=(Comparable)arr;

     * obj.compareTo(xx)

     * }

          */

技术图片

 

 

    2. 使用该方法  Arrays.toString(stu)  就可以将stu数组中的所有元素的所要打印的内容都打印出来

             技术图片

 

       但是每次比较不一定都比较的是id,不同的人有不同的需求,但不可能因为其他人的需求就将用户的源代码就行删改,基于sort()方法,

Java还提供了另一种实现比较的方式(自定义的比较器)。

技术图片

 

 

 

 

即:新new一个类,对这个类实现Comparator接口(注意与Comparable接口的区分),因为Comparator接口里面定义的用来

比较的方法compare()是抽象的,所以在这个新类里面要对它就行重写。

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

技术图片

 

 

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

技术图片

 

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

 

 

     然后在调用sort()方法时,将写的用于比较的那个类也赋进来(以new 对象的方式)。

 

代码实现:

 

 1 package L14;
 2 import java.util.Arrays;
 3 import java.util.Comparator;
 4 class StudentText implements Comparable<StudentText>{
 5     private int id;
 6     private String name;
 7     public StudentText(int id,String name){
 8         this.id=id;
 9         this.name=name;
10     }
11     public String getName() {
12         return name;
13     }
14    @Override
15    public int compareTo(StudentText o){
16         return this.id >o.id?1:(this.id==o.id?0:-1);
17     }
18     @Override
19     public String toString(){   //重写tostring
20         String str="id:"+id+"name:"+name;
21         return str;
22     }
23 
24 }
25  class StudentCompareName implements Comparator<StudentText> {
26     @Override
27      public int compare(StudentText o1, StudentText o2) {
28          return o1.getName().compareTo(o2.getName());  //字符串类型本身也提供了compareTo()方法
29      }
30  }
31 public class Student {
32     public static void main(String[] args) {
33         StudentText[] stu=new StudentText[3];
34         stu[0]=new StudentText(101,"lisi");
35         stu[1]=new StudentText(100,"zhangsan");
36         stu[2]=new StudentText(102,"wangwu");
37         System.out.println(Arrays.toString(stu));    //将数组中的各个元素打印出来
38         /**
39          * void sort(Object[]  arr)
40          * {
41          *   if(arr[i] instanceOf Cmparable)
42          *   {
43          *     Comparable obj=(Comparable)arr;
44          *     obj.compareTo(xx)
45          *   }
46          */
47         Arrays.sort(stu);   //对数组中元素进行排序
48         System.out.println(Arrays.toString(stu));
49         Arrays.sort(stu,new StudentCompareName());
50         System.out.println(Arrays.toString(stu));
51 
52     }
53 }

 

运行结果:

技术图片

 

 

 

但又因为在每次比较一种属性时,都得定义一个类,而且定义的这个类也只能在这个地方使用,所以java又研究出了一种更简单的写法。

即:定义一个实现Comparator接口的匿名对象

技术图片

 

 

然后在调用sort()方法时,将对象和 定义的那个常量作为参数,一并传入。

此处Comparator<StudentText>    NAME_COMP   =   new    Comparator <StudentText>()  不是实例化接口。

而是实例了一个实现了Comparator接口的对象。           

 

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

此外还可以:

Arrays.sort(stu,(a,b)->{return a.getName().compareTo(b.getName());});    

 好处是不用实现接口,也不用重写方法。

 

 

 

 

 

           

                 

以上是关于comparable接口的主要内容,如果未能解决你的问题,请参考以下文章

Java集合框架 Set接口实现类--TreeSet补充: Comparator接口

Java:Comparable和Comparator区别

这段代码里的Object类型为啥能被强制转换为Comparable接口类型呢?

java图中代码改用Lambda表达式实现Comparator接口?

Comparable接口的compareTo()方法

Comparable接口与Comparator接口的比较————Comparator接口详解