zoukankan      html  css  js  c++  java
  • Java中的比较类/接口Comparator和Comparable的使用

    Comparable & Comparator 都是用来实现集合中元素的比较、排序的  .

    1.Comparable 

    Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口)   

    2.Comparator 

    Comparator位于包java.util下    而Comparable位于包  java.lang下

    只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现排序的接口方法,

    Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口)   


    自定义的类要在加入List<T>容器中后能够排序,可以实现Comparable接口,在用Collections类的sort方法排序时,如果不指定Comparator,那么就以自然顺序排序,如API所说:
    Sorts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the Comparable interface
    这里的自然顺序就是实现Comparable接口设定的排序方式。

    而 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。  
    可以说Comparable是自已完成比较,Comparator是外部程序实现比较的差别而已。

    可参考:

    http://ctzlylc.blog.163.com/blog/static/61967136201165981283/

    http://my.oschina.net/leoson/blog/131904

    http://merrygrass.iteye.com/blog/687597

    http://www.aptusource.org/2014/05/object-ordering/

    第一种使用Comparator接口  根据Collections.sort重载方法来实现

     1 /**
     2 * 根据order对User排序 */   
     3 public class User {   
     4 //此处无需实现Comparable接口   
     5     private String name;   
     6     private Integer order;   
     7     public String getName() {   
     8          return name;   
     9      }   
    10     public void setName(String name) {   
    11         this.name = name;   
    12      }   
    13     public Integer getOrder() {   
    14         return order;   
    15      }   
    16     public void setOrder(Integer order) {   
    17        this.order = order;   
    18      }   
    19 }   
    20   
    
    24 public class Test{   
    25     public static void main(String[] args) {   
    26         User user1 = new User();   
    27         user1.setName("a");   
    28         user1.setOrder(1);   
    29         User user2 = new User();   
    30         user2.setName("b");   
    31         user2.setOrder(2);   
    32         List<User> list = new ArrayList<User>();   
    33         list.add(user2);   
    34         list.add(user1);   
    35         Collections.sort(list,new Comparator<User>(){   
    36            public int compare(User user0, User user1) {   
    37                return user0.getOrder().compareTo(user1.getOrder());   
    38             }   
    39         });   
    40        for(User u : list){   
    41            System.out.println(u.getName());   
    42         }   
    43      }   
    44 }      

    第二种使用Comparable接口  list(集合对象)中的对象实现Comparable接口

     1 /**
     2 * 根据order对User排序
     3 */  
     4 public class User implements Comparable<User>{   
     5     private String name;   
     6     private Integer order;   
     7     public String getName() {   
     8         return name;   
     9      }   
    10     public void setName(String name) {   
    11         this.name = name;   
    12      }   
    13     public Integer getOrder() {   
    14         return order;   
    15      }   
    16     public void setOrder(Integer order) {   
    17         this.order = order;   
    18      }   
    19     public int compareTo(User arg0) {   
    20         return this.getOrder().compareTo(arg0.getOrder());   
    21      }   
    22 }   
    23   
    24   
    25   
    26 public class Test{   
    27     public static void main(String[] args) {   
    28           User user1 = new User();   
    29           user1.setName("a"); user1.setOrder(1);   
    30           User user2 = new User(); user2.setName("b");   
    31           user2.setOrder(2);   
    32           List<User> list = new ArrayList<User>();   
    33         //此处add user2再add user1   
    34          list.add(user2); list.add(user1);   
    35          Collections.sort(list);   
    36         for(User u : list){   
    37              System.out.println(u.getName());   
    38          }   
    39      }   
    40 }  
  • 相关阅读:
    ASP.NET调用word开发环境下正常,iis下报错
    关于CSS的两本书的感觉
    蓝牙模块在HHARM2410上的移植
    关于Activity和Task的设计思路和方法
    用蓝牙连接debian和诺基亚手机
    15.2 连接蓝牙设备
    蓝芽:Linux与手机(at,ftp)
    UBUTUN 通过蓝牙连接Hoary和诺基亚手机
    php class类用法总结 Leone
    提高PHP编程效率的53个要点 Leone
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/4284760.html
Copyright © 2011-2022 走看看