java的Comparator和Comparable

zhaosoft1982發表於2010-03-31

當需要排序的集合或陣列不是單純的數字型時,通常可以使用Comparator或Comparable,以簡單的方式實現物件排序或自定義排序。

 

一、Comparator

強行對某個物件collection進行整體排序的比較函式,可以將Comparator傳遞給Collections.sort或Arrays.sort。

介面方法:


  /**
   * @return o1小於、等於或大於o2,分別返回負整數、零或正整數。
   */
  int compare(Object o1, Object o2);

 


案例:

import java.util.Arrays;
import java.util.Comparator;

public class SampleComparator implements Comparator<String> {

  public int compare(String o1, String o2) {
    return toInt(o1) - toInt(o2);
  }

  private int toInt(String str) {
    str = str.replaceAll("一", "1");
    str = str.replaceAll("二", "2");
    str = str.replaceAll("三", "3");
  
    return Integer.parseInt(str);
  }

  /**
   * 測試方法
   */
  public static void main(String[] args) {
    String[] array = new String[] { "一二", "三", "二" };
    Arrays.sort(array, new SampleComparator());
    for (int i = 0; i < array.length; i++) {
      System.out.println(array[i]);
    }
  }

}
 

 二、Comparable

強行對實現它的每個類的物件進行整體排序,實現此介面的物件列表(和陣列)可以通過Collections.sort或Arrays.sort進行自動排序。

介面方法:


  /**
   * @return 該物件小於、等於或大於指定物件o,分別返回負整數、零或正整數。
   */
  int compareTo(Object o);
假設物件User,需要按年齡排序:

public class User {

  private String id;
  private int age;

  public User(String id, int age) {
    this.id = id;
    this.age = age;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

}
改造後的物件:

import java.util.Arrays;

public class User implements Comparable<User> {

  private String id;
  private int age;

  public User(String id, int age) {
    this.id = id;
    this.age = age;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }

  public String getId() {
    return id;
  }

  public void setId(String id) {
    this.id = id;
  }

  public int compareTo(User u) {
    return this.age - u.getAge();
  }

  /**
   * 測試方法
   */
  public static void main(String[] args) {
    User[] users = new User[] { new User("a", 30), new User("b", 20) };
    Arrays.sort(users);
    for (int i = 0; i < users.length; i++) {
      User user = users[i];
      System.out.println(user.getId() + " " + user.getAge());
    }
  }

}


三、Comparator和Comparable的區別

先看一下使用Comparable對User集合實現排序的方式:一個類實現了Camparable介面則表明這個類的物件之間是可以相互比較的,這個類物件組成的集合就可以直接使用sort方法排序。

Comparator可以看成一種演算法的實現,將演算法和資料分離,Comparator也可以在下面兩種環境下使用:

1、類的設計師沒有考慮到比較問題而沒有實現Comparable,可以通過Comparator來實現排序而不必改變物件本身
2、可以使用多種排序標準,比如升序、降序等
在TreeSet和TreeMap中新增的自定義物件必須實現Comparable介面

相關文章