Пример 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) {
TreeSetd = 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Причина в том, что класс Point должен реализовать интерфейс Comparable чтобы разрешить TreeSet содержать объекты Point. Добавленный объект не может быть сравнен с элементами в TreeSet, метод add() выбрасывает исключение ClassCastException. Чтобы сделать объект сопоставимым, необходимо реализовать интерфейс 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)
Следующий код исправляет эту ошибку, реализуя интерфейс 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) {
TreeSettset = new TreeSet ();
tset.add(new Point(2,4));
tset.add(new Point(1,7));
Точка a = новая точка(2,5);
Iteratoriterator = 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: 1References:
Javadoc: TreeSet class