JavaでComparableを使用したTreeSetの例

次の最初の例は、オブジェクトが Set 型のリストに追加されたときに発生するエラーを示しています。Set では、各要素は一意である必要があるため、オブジェクトは一意である必要があります挿入前のTreeSetのオブジェクトと比較します.

まず、3つの「Point」オブジェクトを作成してTreeSetに追加する次のコードを見てみましょう。

import java.util.TreeSet;

class ポイント {
int x,y;
public Point(int x, int y){
this.x = x;
this.y = y;
}
}

public class ImpComparableWrong {

public static void main(String[] args) {
TreeSet d = new TreeSet();
d.add(new Point(2,4));
d.add(new Point(1,7));
d.add(new Point(5,3));

System.out.println(d.size());
}
}
コンパイルと実行は、次の結果を返します:

スレッド "main"の例外 java.lang.ClassCastException:TreeSet.Pointをjava.lang.Comparable
にキャストできません。 java.util.TreeMap.compare(不明なソース)
at java.util.TreeMap.put(不明なソース)
java.util.TreeSet.add(不明なソース)
atTreeSet.Comparable.main(Comparable.java:17)
その理由は、PointクラスがインターフェイスComparable を使用して、TreeSet が Point オブジェクトを保持できるようにします。追加されたオブジェクトは、TreeSetの要素と比較することはできません。 メソッド add() は例外をスローします ClassCastExceptionです。オブジェクトを比較可能にするには、Comparable.

次のコードは、インターフェイス Comparable:

import java.util.Iterator;
import java.util.TreeSet;

class Point は Comparable{
int x,y;
public Point(int x, int y){
this.x = x;
this.y = y;
}

public int compareTo(Point p) {
double dp2 = (double) Math.sqrt(Math.pow(p.x,2) + Math.pow(p.y,2));
double dp = (double) Math.sqrt(Math.pow(x,2) + Math.pow(y,2));
if(dp > dp2)
return 1;
else
0を返します。
}
}

public class Comparabletest {

public static void main(String[] args) {
TreeSet tset = new TreeSet();
tset.add(new Point(2,4));
tset.add(new Point(1,7));

Point a = new Point(2,5);

イテレータ<ドット> iterator = tset.iterator();
while(iterator.hasNext()){
Point p = iterator.next();
System.out.print(p.x +", "+ p.y);
System.out.println(" |p >a: "+p.compareTo(a));
}
}
}
このプログラムはこの結果を出力します:

2, 4 |p >A: 0
1, 7 |p >a: 1
References:
Javadoc: TreeSet class