前回は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 件のコメント:
コメントを投稿