我正在使用Java JungI图形包和Netbeans 7.我从Java中收到以下错误:
Exception in thread "main" java.lang.ClassCastException: graphvisualization.MyVertex cannot be cast to java.lang.Comparable
at java.util.TreeMap.put(TreeMap.java:542)
以下是与错误相关的代码:
SortedMap<MyVertex, Double> vMap = new TreeMap<MyVertex, Double>();
double curRank = 0;
for(MyVertex v: g.getVertices()) //g is a SparseGraph<MyVertex, MyEdge>
{
curRank = vertexRank.getVertexScore(v);
vMap.put(v, curRank); //**Here is my Error**
}
类MyVertex是我为图表制作的一个类。以下是MyVertex的代码
public class MyVertex
{
int vID; //id for this vertex
double centrality; //centrality measure for this vertex
int degree; //the degree of this vertex
public MyVertex(int id)
{
this.vID = id;
this.centrality=0;
this.degree=0;
}
public double getCentrality()
{
return this.centrality;
}
public void setCentrality(double centrality)
{
this.centrality = centrality;
}
public int getDegree()
{
return this.degree;
}
public void setDegree(int deg)
{
this.degree = deg;
}
public void incrementDegree()
{
this.degree++;
}
public void decrementDegree()
{
this.degree--;
}
@Override
public String toString()
{
return "v"+vID;
}
int compareTo(MyVertex v)
{
return (this.degree < v.degree) ? 1 : 0; //this will do descendingly
}
}
答案 0 :(得分:15)
如何将MyVertex类型转换为可比较数据?
实施可比较的界面。
public class MyVertex implements Comparable<MyVertex> {
@Override
public int compareTo(Object o) {
// comparison logic goes here
}
}
或者,您可以将comparator
传递给TreeMap
的构造函数。
new TreeMap<MyVertex, Double>(new Comparator<MyVertex>()
{
public int compare(MyVertex o1, MyVertex o2)
{
//comparison logic goes here
}
});
为什么这有必要?
因为您存储在树形图中,它是一个有序地图(按键排序)。地图键需要具有可比性,以确保地图中的排序顺序。
答案 1 :(得分:10)
该行为符合javadoc of TreeMap:
如果无法将指定的键与当前在地图中的键进行比较,则抛出ClassCastException
基本上有两种方法可以使它发挥作用:
MyVertex
实施Comparable<MyVertex>
Comparator<MyVertex>
传递给TreeMap的构造函数请注意,在Java 7之前,只有在向地图添加第二个项目时才会抛出异常,而使用Java 7时,在向地图添加一个项目时会抛出异常。
答案 2 :(得分:5)
MyVertex
类应该实现Comparable
,因为树图使用compareTo方法根据键对地图进行排序。
public class MyVertex implements Comparable<MyVertex> {
@Override
public int compareTo(MyVertex o) {
// do the comparison logic
}
}
其他选项是将比较器对象传递给TreeMap http://docs.oracle.com/javase/1.5.0/docs/api/java/util/TreeMap.html#TreeMap(java.util.Comparator)
答案 3 :(得分:0)
您的课程尚未实施Comparable接口。
你有方法compareTo();所以只需将 implements Comparable 添加到您的班级 MyVertex 。
答案 4 :(得分:0)
- 首先,你应该让MyVertex类实现Comparable。
<强>例如强>
public class MyVertex implements Comparable {
@Override
public int compareTo(MyVertex o) {
}
}
- 但是如果你想根据对象的多个属性进行比较,那么最好使用java.util.Comparator<T>
接口。
new TreeMap<MyVertex, Double>(new Comparator<MyVertex>()
{
public int compare(MyVertex o1, MyVertex o2)
{
}
});