#とても紛らわしい
ソートしたければHashSetではなくTreeSetを用いればよいが、自分のオリジナルの順序付けを施したいことがある。そんなときにComparatorやComparableが有効である。
#Comparable
java.lang.Comparable インターフェース「比較可能」
(1)TreeSetクラスは、内部で要素を並べ替える時に__Comparable型__にキャストする処理を行なっている。
(2)標準ライブラリのStringクラスやIntegerクラスなどの値クラスはComparableインターフェースを実装している。
class MyClass implements Comparable<Myclass>{
//抽象メソッドの実装
public int compareTo(Myclass obj){
return this.id - obj.id;
}
}
//昇順
#Comparator
java.util.Comparatorインターフェース 「比較器」
Comparatorが利用されるモチベーションは、TreeSetやTreeMapなどに格納される要素の並べ替え順序をデフォルトとは別の順序に変更したいような時である。
class Myclass implements Comparator<String>{
@Override
public int compare(String obj1, String obj2){
return obj1.length() - obj2.length();
}
}
//昇順
コンストラクタ | 説明 |
---|---|
TreeSet(Comparator<? super E> comparator) | 指定されたコンパレータにしたがってソートされた新しい空のツリーセットを作成する |
TreeSetにはComparatorオブジェクトを引数にとるコンストラクタが宣言されている(OraDocsに記載されている)ので任意の並べ替え順序を適用できる。
#まとめ
Comparableは「自分と他のオブジェクトを比較」
Comparatorは「他の2つのオブジェクトを比較」
(備忘録:ComparableやComparatorが紛らわしいというよりかは、TreeSetやTreeMapの定義があやふやなのかも)