2012年1月7日土曜日

JavaのComparatorの使い方

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

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計