読者です 読者をやめる 読者になる 読者になる

methaneのブログ

このブログに乗せているサンプルコードはすべてNYSLです。

比較関数を組み合わせる

http://d.hatena.ne.jp/calotocen/20060214/1139938613
普通に打ち切っちゃったので、引き継いでみる。
Excelのソートみたいに、幾つかの比較方法を優先順位を付けて組み合わせたいときがある。そんな時、要求に見合った比較関数を新しく作る・・・のはイケてない。「Comparatorを組み合わせる」という汎用性のある要求があるのだから、それに対応しなきゃ。

import java.util.*;

// Comparatorくっつけクラス. 
class MultiLevelComparator implements 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();
    }
}