今までTopCoderで利用してきたソートにArrays.sort(配列)というメソッドがあるのだが、実は第2引数を取ることができる。第2引数ではソートの手法を示すメソッドを含むオブジェクトを渡すことになる。C言語のqsort関数と同様の仕組みがJavaにもあるということである。
サンプルとして、短い文字列から長い文字列になるようなソートを行うことにした。長さが同じものについては、文字の大小の区別をなくした上で、辞書順に並ぶようにする。
まず、比較のメソッドを含むオブジェクトに関するクラスをCompTest.javaに書いた。
import java.util.Comparator;
// 次行のStringは比較する2要素の型を示している。
public class CompTest implements Comparator<String>{
@Override // オーバーライドしている場合につける注釈
// 関数名のcompareは決まりごとである。
public int compare(String s1, String s2 ){
// s1がs2より先に来るなら、s1の特徴量がs2のそれより小さくなるような関数を作成する。
if( s1.length() > s2.length() ){
return 1;
}else if( s1.length() < s2.length() ){ // s1の方がs2より短い文字列になっている場合
return -1;
}else{
return s1.compareToIgnoreCase(s2);
}
}
}テスト用のmain関数を含むクラスがあるファイルはtest.javaとした。
import java.util.Arrays;
public class test {
public static void main(String args[]){
String[] lang = {"Java","Lisp","Haskell","C","Go"};
Arrays.sort(lang, new CompTest() ); // 配列のソートの第2引数にCompTestを渡す
for( int i=0 ; i<lang.length ; i++ ){
System.out.println(i + ":" + lang[i]);
}
}
}ソートした結果は次の通りである。
0:C 1:Go 2:Java 3:Lisp 4:Haskell

0 件のコメント:
コメントを投稿