ソートの解答

id:mzp:20070412:exersiceの解答。一応、出題した以上は解答をば。ちなみに肝はインターフェイスの使い方。

まず、ソート対象が何かの配列となっているので、比較メソッドが一意に決まらない。なので、ソートを行うメソッドに比較メソッドを渡してやる必要がある。
しかしながら、Java5ではメソッドを渡すことはできないので、インターフェース(interface)を渡すことにする。

interface Compare{
    public int compare(Object a,Object b);
}
class Sort{
    public Object[] sort(Object[] array,Compare cmp){
        // ............
    }
}

そして、このメソッドを呼び出すときは、Compareを継承したクラスのインスタンスを渡してやるようにする。
ただ、いちいちクラスを宣言するのは面倒なので無名クラス構文を使うことにする。

sort(int_array,new Compare() {
		public int compare(Object a,Object b){
		    Integer a_ = (Integer)a;
		    Integer b_ = (Integer)b;
		    return a_ - b_;
		}
    });

あとは、sortメソッドを実装すればいいのだけれど、クイックソートはやっぱり面倒なのでバブルソートお茶を濁すことにする。

public Object[] sort(Object[] array,Compare cmp){
    for(int i = 0 ; i < array.length ; i++){
	for(int j = i+1 ; j < array.length ; j++){
	    if(cmp.compare(array[i],array[j]) > 0){
		// array[i] > array[j]
		Object t = array[i];
		array[i] = array[j];
		array[j] = t;
	    }
	}
    }
    return array;
}

これで、おしまい。最後に全コードを載せて終わることにする。

interface Compare{
    public int compare(Object a,Object b);
}
class Sort{
    public Sort(){
    }
    
    public Object[] sort(Object[] array,Compare cmp){
	for(int i = 0 ; i < array.length ; i++){
	    for(int j = i+1 ; j < array.length ; j++){
		if(cmp.compare(array[i],array[j]) > 0){
		    // array[i] > array[j]
		    Object t = array[i];
		    array[i] = array[j];
		    array[j] = t;
		}
	    }
	}
	return array;
    }

    public void test(){
	Integer int_array[] = {6,4,2,3,1};
	print_array(sort(int_array,new Compare() {
		public int compare(Object a,Object b){
		    Integer a_ = (Integer)a;
		    Integer b_ = (Integer)b;
		    return a_ - b_;
		}
	    }));

	String str_array[] = {"foo","bar","baz"};
	print_array(sort(str_array,new Compare() {
		public int compare(Object a,Object b){
		    String a_ = (String)a;
		    String b_ = (String)b;
		    return a_.compareTo(b_);
		}
	    }));
    }

    public void print_array(Object array[]){
	System.out.print("[");
	for(Object o:array ){
	    System.out.print(o);
	    System.out.print(",");
	}
	System.out.print("]\n");
    }

    public static void main(String[] args){
	Sort sort = new Sort();
	sort.test();
    }
}

# つづかない