Possible Duplicate:
Java: SortedMap, TreeMap, Comparable? How to use?
I am using the Java JungI graph package and Netbeans 7. I am getting the following error from 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)
Here is the code associated with the error:
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**
}
Class MyVertex is a class I made for graphs. The following is the code for 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
}
}
- How do I get MyVertex types to be casted to Comparables?
- Why is this necessary? (I do not immediately see the reason)
How do I get MyVertex types to be casted to Comparables?
Implement Comparable interface.
public class MyVertex implements Comparable<MyVertex> {
@Override
public int compareTo(Object o) {
// comparison logic goes here
}
}
or alternately, you can pass a comparator
to the constructor of TreeMap
.
new TreeMap<MyVertex, Double>(new Comparator<MyVertex>()
{
public int compare(MyVertex o1, MyVertex o2)
{
//comparison logic goes here
}
});
Why is this necessary?
Because you are storing in tree map which is a sorted map (sorted by keys). Map Keys need to be comparable to ensure a sort order in the map.
The behaviour is compliant with the javadoc of TreeMap:
Throws ClassCastException if the specified key cannot be compared with the keys currently in the map
There are essentially two ways to make it work:
- either make
MyVertex
implementComparable<MyVertex>
- or pass a
Comparator<MyVertex>
to the constructor of your TreeMap
Note that before Java 7, the exception would only be thrown when adding a second item to the map whereas with Java 7 the exception is thrown when adding one item to the map.
MyVertex
class should implement Comparable
as tree map uses the compareTo method to order the map based on keys.
public class MyVertex implements Comparable<MyVertex> {
@Override
public int compareTo(MyVertex o) {
// do the comparison logic
}
}
Other option is to pass a Comparator Object to TreeMap http://docs.oracle.com/javase/1.5.0/docs/api/java/util/TreeMap.html#TreeMap(java.util.Comparator)
Your class has not implemented Comparable interface.
You have method compareTo(); so just add implements Comparable to your class MyVertex .
- First you should make class MyVertex implement Comparable.
Eg:
public class MyVertex implements Comparable {
@Override
public int compareTo(MyVertex o) {
}
}
- But if you want to compare on the basis of more than one attribute of the object, then its better to use java.util.Comparator<T>
interface.
new TreeMap<MyVertex, Double>(new Comparator<MyVertex>()
{
public int compare(MyVertex o1, MyVertex o2)
{
}
});
来源:https://stackoverflow.com/questions/14133600/java-cannot-cast-to-comparable-when-using-treemap