当前位置: 首页 > 面试题库 >

使用TreeMap时Java“无法转换为可比”

朱保赫
2023-03-14
问题内容

我正在使用Java
JungI图形包和Netbeans7。我从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类型转换为可比对象?
  2. 为什么这是必要的?(我没有立即看到原因)

问题答案:

如何将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
            } 
    });

为什么这是必要的?

因为您存储在树状地图中,该树状地图是排序的地图(按键排序)。映射键必须具有可比性,以确保映射中的排序顺序。



 类似资料:
  • 我有一张这样的单子 null

  • 我从rest调用中获得了一个json,其格式为{“D1”:1,“D2”:1,“D3”:0,“D4”:1},它在db中存储为-{D1=1,D2=1,D3=0,D4=1}。 到目前为止我已经试过了,但没有成功- JSONParser parser=新的JSONParser();JSONObject json=(JSONObject)parser.parse(jsonString); 我想把这个json

  • 本文向大家介绍在Java中将HashMap转换为TreeMap的程序,包括了在Java中将HashMap转换为TreeMap的程序的使用技巧和注意事项,需要的朋友参考一下 首先创建一个HashMap- 现在,将上面的HashMap转换为TreeMap- 示例 以下是在Java中将HashMap转换为TreeMap的程序- 输出结果

  • 问题内容: 我有包含我的上下文的课程。但是,当我编译时,在这一行中出现了另一个类: 类: 错误: AndroidManifest.xml: 问题答案: 您需要在清单中指定以使用自定义应用程序。 这是完整的

  • 问题内容: 我正在使用spring通过bean创建对象。现在,我尝试使用aop创建相同的对象,并且我无法将$ Proxy强制转换为SaleRoom异常。 先前的xml是: 我使用以下代码创建销售: 这是新的xml: Aspect日志记录类: 我正在使用相同的代码通过aop创建bean。并且在线程“主”中得到异常java.lang.ClassCastException:$ Proxy11无法转换为a

  • 假设我有一个字符串流: 工作正常: 比较器是一种功能接口。这意味着我们可以使用方法引用或lambdas来实现它。Comparator接口实现一个方法,该方法接受两个字符串参数并返回一个int。但是,Comparator::ReverseOrder不这样做。它是对接受零参数并返回比较器的函数的引用。这与接口不兼容。这意味着我们必须使用方法,而不是方法引用。 但我不明白。