Java 中具有 Comparable 的 TreeSet 示例

下面的第一个示例显示了将对象添加到 Set 类型的列表时发生的错误。在 Set 中,每个元素必须是唯一的,这就是对象必须与插入前 TreeSet 中的对象相比。

首先,让我们看一下下面的代码,它创建了三个 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(新点 (2,4));
d.add(新点 (1,7));
d.add(新点 (5,3));

System.out.println(d.size());
}
}
编译和执行返回以下结果:

线程 main” 中的异常 java.lang.ClassCastException: TreeSet.Point 无法强制转换为 java.lang.Comparable
at java.util.TreeMap.compare(Unknown Source)
at java.util.TreeMap.put(Unknown Source)
at java.util.TreeSet.add(Unknown Source)
at java.util.TreeSet.add(Unknown Source)br / atTreeSet.Comparable.main(Comparable.java:17)
原因是 Point 类需要实现接口 Comparable 允许 TreeSet 保存 Point 对象。添加的对象无法与 TreeSet 中的元素进行比较,方法 add() 抛出异常 ClassCastException。要使对象具有可比性,您需要实现 Comparable.

以下代码通过实现接口 Comparable:

import java.util.Iterator;
导入 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)
返回 1;
else
返回 0;
}
}

public class Comparabletest {

public static void main(String[] args) {
TreeSet tset = new TreeSet();
tset.add(新点 (2,4));
tset.add(新点 (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( |p >a: +p.compareTo(a));
}
}
}
此程序输出此结果:

2, 4 |p >答:0
1, 7 |p >a: 1
References:
Javadoc: TreeSet 类