zoukankan      html  css  js  c++  java
  • java之Comparator与Comparable

    转自:http://blog.csdn.net/zhangerqing

    当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。

    一、Comparator

    强行对某个对象collection进行整体排序的比较函数,可以将Comparator传递给Collections.sort或Arrays.sort。

    接口方法:

    [java] view plaincopy
    1. /** 
    2.   * @return o1小于、等于或大于o2,分别返回负整数、零或正整数。 
    3.   */  
    4.  int compare(Object o1, Object o2);  


    例子:

    [java] view plaincopy
    1. import java.util.Arrays;  
    2. import java.util.Comparator;  
    3.   
    4. public class SampleComparator implements Comparator {  
    5.   
    6.   public int compare(Object o1, Object o2) {  
    7.     return toInt(o1) - toInt(o2);  
    8.   }  
    9.   
    10.   private int toInt(Object o) {  
    11.     String str = (String) o;  
    12.     str = str.replaceAll("一""1");  
    13.     str = str.replaceAll("二""2");  
    14.     str = str.replaceAll("三""3");  
    15.     //   
    16.     return Integer.parseInt(str);  
    17.   }  
    18.   
    19.   /** 
    20.    * 测试方法 
    21.    */  
    22.   public static void main(String[] args) {  
    23.     String[] array = new String[] { "一二""三""二" };  
    24.     Arrays.sort(array, new SampleComparator());  
    25.     for (int i = 0; i < array.length; i++) {  
    26.       System.out.println(array[i]);  
    27.     }  
    28.   }  
    29.   
    30. }  

    二、Comparable

    强行对实现它的每个类的对象进行整体排序,实现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。

    接口方法:

    [java] view plaincopy
    1. /** 
    2.  * @return 该对象小于、等于或大于指定对象o,分别返回负整数、零或正整数。  
    3.  */  
    4. int compareTo(Object o);  


    假设对象User,需要按年龄排序:

    [java] view plaincopy
    1. public class User {  
    2.   
    3.   private String id;  
    4.   private int age;  
    5.   
    6.   public User(String id, int age) {  
    7.     this.id = id;  
    8.     this.age = age;  
    9.   }  
    10.   
    11.   public int getAge() {  
    12.     return age;  
    13.   }  
    14.   
    15.   public void setAge(int age) {  
    16.     this.age = age;  
    17.   }  
    18.   
    19.   public String getId() {  
    20.     return id;  
    21.   }  
    22.   
    23.   public void setId(String id) {  
    24.     this.id = id;  
    25.   }  
    26.   
    27. }  

    改造后的对象:

    [java] view plaincopy
    1. import java.util.Arrays;  
    2.   
    3. public class User implements Comparable {  
    4.   
    5.   private String id;  
    6.   private int age;  
    7.   
    8.   public User(String id, int age) {  
    9.     this.id = id;  
    10.     this.age = age;  
    11.   }  
    12.   
    13.   public int getAge() {  
    14.     return age;  
    15.   }  
    16.   
    17.   public void setAge(int age) {  
    18.     this.age = age;  
    19.   }  
    20.   
    21.   public String getId() {  
    22.     return id;  
    23.   }  
    24.   
    25.   public void setId(String id) {  
    26.     this.id = id;  
    27.   }  
    28.   
    29.   public int compareTo(Object o) {  
    30.     return this.age - ((User) o).getAge();  
    31.   }  
    32.   
    33.   /** 
    34.    * 测试方法 
    35.    */  
    36.   public static void main(String[] args) {  
    37.     User[] users = new User[] { new User("a"30), new User("b"20) };  
    38.     Arrays.sort(users);  
    39.     for (int i = 0; i < users.length; i++) {  
    40.       User user = users[i];  
    41.       System.out.println(user.getId() + " " + user.getAge());  
    42.     }  
    43.   }  
    44.   
    45. }  

    三、Comparator和Comparable的区别

    先看一下使用Comparator对User集合实现排序的方式:

    [java] view plaincopy
    1. import java.util.Arrays;  
    2. import java.util.Comparator;  
    3.   
    4. public class UserComparator implements Comparator {  
    5.   
    6.   public int compare(Object o1, Object o2) {  
    7.     return ((User) o1).getAge() - ((User) o2).getAge();  
    8.   }  
    9.   
    10.   /** 
    11.    * 测试方法 
    12.    */  
    13.   public static void main(String[] args) {  
    14.     User[] users = new User[] { new User("a"30), new User("b"20) };  
    15.     Arrays.sort(users, new UserComparator());  
    16.     for (int i = 0; i < users.length; i++) {  
    17.       User user = users[i];  
    18.       System.out.println(user.getId() + " " + user.getAge());  
    19.     }  
    20.   }  
    21.   
    22. }  


    一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
    Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
    1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
    2、可以使用多种排序标准,比如升序、降序等

  • 相关阅读:
    python 面向对象专题(二):类的空间问题、类与对象之间的关系、类与类之间的关系
    python 面向对象专题(一):面向对象初识、面向对象结构、类、self、实例化对象
    数据可视化之PowerQuery篇(二十)如何计算在职员工数量?
    数据可视化之PowerQuery篇(十九)PowerBI数据分析实践第三弹 | 趋势分析法
    数据可视化之PowerQuery篇(十八)Power BI数据分析应用:结构百分比分析法
    数据可视化之PowerQuery篇(十七)Power BI数据分析应用:水平分析法
    ccoshf (Numerics) – C 中文开发手册
    HTML DOM removeAttribute() 方法
    curses.panel (Operating System) – Python 中文开发手册
    在Java中使用预定义的类名作为类或变量名称
  • 原文地址:https://www.cnblogs.com/marcotan/p/4256905.html
Copyright © 2011-2022 走看看