今まで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 件のコメント:
コメントを投稿