http://d.hatena.ne.jp/calotocen/20060214/1139938613
普通に打ち切っちゃったので、引き継いでみる。
Excelのソートみたいに、幾つかの比較方法を優先順位を付けて組み合わせたいときがある。そんな時、要求に見合った比較関数を新しく作る・・・のはイケてない。「Comparatorを組み合わせる」という汎用性のある要求があるのだから、それに対応しなきゃ。
import java.util.*; // Comparatorくっつけクラス. class MultiLevelComparatorimplements Comparator { //publicで晒してゴメンナサイ。 public Vector< Comparator > comparators; public MultiLevelComparator(){ comparators = new Vector< Comparator >(); } public int compare(T lh, T rh){ for( int i = 0; i < comparators.size(); ++i ){ int ret = comparators.get(i).compare( lh, rh ); if( ret != 0 ) return ret; } return 0; } } public class MultiLevelComparatorTest{ class MultipleOfNIsBigger implements Comparator { private int base; public MultipleOfNIsBigger(int N){ base = N; } public int compare(Integer lh, Integer rh){ int isLhBig = lh.intValue() % base == 0 ? 1 : 0; int isRhBig = rh.intValue() % base == 0 ? 1 : 0; return isLhBig - isRhBig; } } public void test1(){ MultiLevelComparator mlComp = new MultiLevelComparator (); mlComp.comparators.add( new MultipleOfNIsBigger(7) ); mlComp.comparators.add( new MultipleOfNIsBigger(5) ); mlComp.comparators.add( new MultipleOfNIsBigger(3) ); Integer testData = new Integer[4]; testData[0] = 13; testData[1] = 14; testData[2] = 15; testData[3] = 18; for(int i : testData){ System.out.println( i ); } Arrays.sort( testData, mlComp ); System.out.println( "--sorted--" ); for(int i : testData){ System.out.println( i ); } } public static void main(String args){ new MultiLevelComparatorTest().test1(); } }