遺伝子の初期化を実装するぜぇと思ってソース見たんだけどちょっとかったるそうだったので遺伝子集団のソートメソッドを先に作ることにした。えぇ、楽な方に逃げましたλ....
でも今やってるこのプロジェクト内ってオレ一人だけだから結局、初期化実装逃げられない(;´Д`)
誰かjavaがばりばり出来る人が入ってほしぃ~。せっかくCVSサーバ立ててもコミットしかしてねぇし...orz
話を戻して題名にあるようにコレクションのソート。去年の夏に会社でこの辺鍛えたおかげで余裕だぜぇと思ったらjdk1.5.0でGenricsが導入後、Object型を使わないようにこだわるとちょっと作り方が変わるので、復習の意味も兼ねてその辺をmemo。
基本的にコレクションのソートはCollectionsクラスのstaticメソッドであるsortを使う。
このsortメソッドはソート対象となるコレクションだけを渡すsort(hogeList)と
コレクションと『「そのコレクションをどんな感じで比較するのかが記述されているメソッドを持つクラス」のインスタンス』を渡すsort(hogeList, new hogeComparator())の2つがある。(hogeComparatorクラスはComparatorインターフェースをimplementsする。んでhogeComparator内でcompareメソッドを実装するわけです。Cのqsortとほとんど同じ。)
前者の方法だとコレクションを表すクラスの方にComparableインターフェースを実装して色々書かなきゃいけないので、普通は(比較だけをする部分として分離できるから?)後者の方を用いるみたい。
んで書き方なんだけど例えば拠点の座標を表すPointというクラスがあってこのクラスのオブジェクトを既に複数突っ込んだ
ArrayList<Point> pointList = new ArrayList<Point>();があったとする。pointList の中身をx座標で昇順に並べ替えたいなぁってときには
以前:Collections.sort(pointList, PointComparator.getInstance());
java5.0:Collections.<Point>sort(pointList, PointComparator.getInstance());
と言った感じでsortメソッドを呼び出す。Comparatorをいちいちnewしても無駄なのでここではsingletonなクラスにした。java5.0の方が長くなっちゃっているがメソッドにパラメータとしてPointを渡すことによりsortの引数に来るのがPointのコレクションとPointオブジェクトを比較する何かと言う風に教えてやることが出来る...のだろう(ゴメン、メソッドのパラメータに関してはまだ理解が曖昧であります(;´Д`) 別に指定してあげなくてもコレクションの型とComparatorの比較対照となる型があってれば警告はでないが、多分ここで明示してあげた方がイイのだろう...。)
PointComparatorはこんな感じになる。
以前:
public class PointComparator implements Comparator {
private static PointComparator singleton = new PointComparator();
private PointComparator() {
}
public int compare(Object o1, Object o2) {
return ((Point)o1).getX() - ((Point)o2).getX();
}
public static PointComparator getInstance() {
return singleton;
}
}
compareメソッドのreturn文がキャストのおかげで汚くなっているが...java5.0だと...
java5.0:
public class PointComparator implements Comparator<Point> {
private static PointComparator singleton = new PointComparator();
private PointComparator() {
}
public int compare(Point p1, Point p2) {
return p1.getX() - p2.getX();
}
public static PointComparator getInstance() {
return singleton;
}
}
implements インターフェースの所でPointとパラメータを渡し、明示したおかげcompareメソッドの引数がObjectからPointに変わり、スッキリ書ける。他にもy座標で比較するComparator、原点からの距離で比較するComparator等も適時作れば、Comparatorを変えるだけで好きなようにソートできる。あぁ...2つあるsortメソッドのうち、Comparatorを渡す方が使われる理由って正にコレかw書きながら理解。