JAvaでのカスタムソートの実現方法


解題ではカスタムソートがよく使われ、この文章をここに置いておきます.
並べ替えが必要な集合や配列が単純な数値型ではない場合、オブジェクトの並べ替えやカスタム並べ替えを簡単に実現するために、通常、2つのインタフェースComparatorまたはComparableが使用されます.
一、Comparator
オブジェクトcollectionの全体的なソートを強行する比較関数は、ComparatorをCollectionsに渡すことができる....sort.
インタフェースの方法:
/**
*@return o 1は、o 2より小さく、等しい、またはより大きく、それぞれ負の整数、ゼロまたは正の整数を返します.
*/
   int compare(Object o1, Object o2);
例:
import java.util.Arrays;
import java.util.Comparator;
public class SampleComparator implements Comparator {
  public int compare(Object o1, Object o2) {
    return toInt(o1) - toInt(o2);
  }
  private int toInt(Object o) {
    String str = (String) o;
    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]);
    }
  }
}
C:\hdu>java SampleComparator
 
 
  

二、Comparable
実装された各クラスのオブジェクトを強制的に並べ替えます.このインタフェースを実装するオブジェクトのリスト(および配列)は、Collections.sortまたはArrays.sortによって自動的に並べ替えられます.
インタフェースの方法:
/**
*@return指定したオブジェクトoより小さい、等しい、または大きいオブジェクトは、それぞれ負の整数、ゼロ、または正の整数を返します.
*/
  int compareTo(Object o);
オブジェクトUserを年齢順にソートする必要があるとします.
import java.util.Arrays;
public class User implements Comparable {
  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(Object o) {
    return this.age - ((User) o).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());
    }
  }
}
C:\hdu>javac User.java

C:\hdu>java User
b 20
a 30

 、Comparator Comparable   

      Comparator User         :

import java.util.Arrays;
import java.util.Comparator;
public class UserComparator implements Comparator {
  public int compare(Object o1, Object o2) {
    return ((User) o1).getAge() - ((User) o2).getAge();
  }
  /**
   *     
   */
  public static void main(String[] args) {
    User[] users = new User[] { new User("a", 30), new User("b", 20) };
    Arrays.sort(users, new UserComparator());
    for (int i = 0; i < users.length; i++) {
      User user = users[i];
      System.out.println(user.getId() + " " + user.getAge());
    }
  }
}
C:\hdu>java UserComparator
b 20
a 30

1つのクラスがCamparableインタフェースを実装すると,このクラスのオブジェクト間は互いに比較可能であり,このクラスのオブジェクトからなる集合はsortメソッドを直接用いてソートできることを示した.Comparatorはアルゴリズムの実装と見なすことができ、アルゴリズムとデータを分離し、Comparatorは次の2つの環境で使用することができます.
1、クラスのデザイナーは比較問題を考慮せずにComparableを実現せず、オブジェクト自体を変えることなくComparatorでソートを実現できる
2、昇順、降順など、多種の並べ替え基準を使用することができる
投稿:
http://www.blogjava.net/fastunit/archive/2008/04/08/191533.html