9

可能重复:
Java:SortedMap、TreeMap、Comparable?如何使用?

我正在使用 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
    }
}
  1. 如何将 MyVertex 类型转换为 Comparables?
  2. 为什么这是必要的?(我没有立即看到原因)
4

5 回答 5

17

如何将 MyVertex 类型转换为 Comparables?

实现 Comparable 接口。

public class MyVertex implements Comparable<MyVertex> {

  @Override
  public int compareTo(Object o) {
   // comparison logic goes here

  }
 }

或者,您可以将 a 传递comparatorTreeMap.

 new TreeMap<MyVertex, Double>(new Comparator<MyVertex>()
        {
            public int compare(MyVertex o1, MyVertex o2)
            {
                //comparison logic goes here
            } 
    });

为什么这是必要的?

因为您存储在树图中,它是一个排序图(按键排序)。地图键需要具有可比性以确保地图中的排序顺序。

于 2013-01-03T05:39:00.680 回答
10

该行为符合TreeMap 的 javadoc

如果指定的键无法与映射中当前的键进行比较,则抛出 ClassCastException

基本上有两种方法可以使它工作:

  • 要么MyVertex实现Comparable<MyVertex>
  • 或将 a 传递Comparator<MyVertex>给 TreeMap 的构造函数

请注意,在 Java 7 之前,只有在向地图添加第二项时才会引发异常,而在 Java 7 中,向地图中添加一项时会引发异常。

于 2013-01-03T05:38:13.343 回答
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 )

于 2013-01-03T05:38:38.727 回答
0

您的课程尚未实现 Comparable 接口。

你有方法 compareTo(); 所以只需将实现 Comparable添加到您的类MyVertex

于 2013-01-03T05:38:52.350 回答
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)
            {

            } 
    });
于 2013-01-03T06:33:27.640 回答