Пример TreeSet с Comparable в Java

В первом примере ниже показана ошибка, возникающая при добавлении объекта в список типа Set. В Set каждый элемент должен быть уникальным, поэтому объект должен быть по сравнению с объектами в TreeSet до того, как он был вставлен.

Во-первых, давайте посмотрим на следующий код, который создает три объекта "Point" и добавляет их в TreeSet.

import java.util.TreeSet; 

class Point {
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(Unknown Source)
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at TreeSet.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));

Точка a = новая точка(2,5);

Iterator iterator = tset.iterator();
while(iterator.hasNext()){
Точка p = iterator.next();
System.out.print(p.x +", "+ p.y);
System.out.println(" | стр > a: "+p.compareTo(a));
}
}
}
Эта программа выводит следующий результат:

2, 4 | стр > Ответ: 0<бр />1, 7 | стр > a: 1
References:
Javadoc: TreeSet class