2012年1月8日日曜日

JavaのComparableの使い方

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

コメントを投稿

フォロワー

ブログ アーカイブ

ページビューの合計