zoukankan      html  css  js  c++  java
  • comparable接口

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

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

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

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

    即1:

     

       代码实现:

     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还提供了另一种实现比较的方式(自定义的比较器)。

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

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

    注:不必在实现Comparable()接口,也不用重写compareTo()方法。

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

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

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

         然后在调用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又研究出了一种更简单的写法。

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

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

     

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

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

    注:不必在实现Comparable()接口,也不用重写compareTo()方法。          

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

    此外还可以采用λ表达式:

    Arrays.sort(stu,(a,b)->{return a.getName().compareTo(b.getName());});    
    这是从小到大进行排列的,若要从大到小,则a.getName()前面加上负号。
    如:
    
    

     这种排序的好处是不用实现接口,也不用重写方法。

               

                     

  • 相关阅读:
    【转帖】太晚睡觉等于自杀(一定要看看,以后不熬夜了!)程序员必看
    C盘碎片整理时“无法移动的文件”的处理
    【转帖】VS2008+SQL2005开发环境搭建
    【转帖】财务尽职调查资料收集总结
    SQL2005开发版SSIS正常连接需要修改的地方
    【未解决】制作可选择目录树的控件(替换使用参数进行递进选择)
    【未解决】VS2008与Reporting Services结合生成的网站,速度超慢,何故?
    新博开张
    【已解决】尝试为文件 ......\App_Data\aspnetdb.mdf 附加自动命名的数据库,但失败...
    SSRS表达式
  • 原文地址:https://www.cnblogs.com/ljl150/p/11725148.html
Copyright © 2011-2022 走看看