前回はComparatorを用いたソートを行ったが、今回はComparableインタフェースを用いたソートを実装してみた。
例題として、絶対値の小さい順にソートするということを考える。もし、絶対値が同じ値が複数現れた場合は、先に現れた方を先に配置するようにする。
import java.util.Arrays;
class comparableTest{
public static void main(String[] args){
sortByAbs[] data = new sortByAbs[5];
data[0] = new sortByAbs(3);
data[1] = new sortByAbs(-3);
data[2] = new sortByAbs(0);
data[3] = new sortByAbs(-10);
data[4] = new sortByAbs(5);
Arrays.sort(data);
for( int i=0 ; i<data.length ; i++ ){
System.out.println(data[i].val);
}
}
}
class sortByAbs implements Comparable<sortByAbs>{
int val;
public sortByAbs(int val) {
// TODO 自動生成されたコンストラクター・スタブ
this.val = val;
}
@Override
public int compareTo(sortByAbs o) {
// TODO 自動生成されたメソッド・スタブ
return Math.abs(val)-Math.abs(o.val);
}
}このコードを実行すると次の結果が得られる。0に近い順にソートされていることが分かる。
0 3 -3 5 -10
注目すべき点としては、Arrays.sort()に第2引数は不要であるということである。sortByAbs型のソート方法はcompareToメソッドで既に分かっているからである。Comparatorと比較すると、Comparatorはオブジェクトに対し複数のソート方法を用意できるが、Comparableは1種類しか用意できないという違いがある。
また、当初分からないコンパイルエラーのメッセージがあった。上記のコードは既にエラーを取り除いた結果であるが、記録を兼ねて残しておく。
sortByAbs cannot be cast to java.lang.Integer comparable
このコードはComparableの後にintで比較するからということで<Integer>をつけていたのが原因だった。どのような型のオブジェクトを比較するのかを書く必要があり、<sortByAbs>とするのが正しい。
0 件のコメント:
コメントを投稿