java - 如何使用 Scala 的 GraphStream 库

标签 java scala graph scala-collections graphstream

我尝试使用 GraphStream 库来查找图中 2 个节点之间的最短路径。最后,我能够打印路径的边缘( it.foreach(println) ),但当时无法访问一个元素。这是代码:

import org.graphstream.algorithm.Dijkstra;
import org.graphstream.graph.Edge;
import org.graphstream.graph.Graph;
import org.graphstream.graph.Node;
import org.graphstream.graph.Path;
import org.graphstream.graph.implementations.SingleGraph;
import scala.collection.JavaConverters._


object MainApp extends App{


        def exampleGraph():Graph={
                  val g:Graph = new SingleGraph("example");
                  g.addNode("N1_S1");
                  g.addNode("N1_J1");
                  g.addNode("N1_H1");
                  g.addNode("N1_J2");
                  g.addNode("N1_H2");
                  g.addNode("N1_W1");
                  var e:Edge=g.addEdge("N1_S1-N1_J1", "N1_S1", "N1_J1")
                  e.addAttribute("length",Int.box(6))
                  e=g.addEdge("N1_J1-N1_H1", "N1_J1", "N1_H1")
                  e.addAttribute("length",Int.box(8))
                  e=g.addEdge("N1_J1-N1_J2", "N1_J1", "N1_J2")
                  e.addAttribute("length",Int.box(8))
                  e=g.addEdge("N1_J2-N1_H2", "N1_J2", "N1_H2")
                  e.addAttribute("length",Int.box(4))
                  e=g.addEdge("N1_J2-N1_W1", "N1_J2", "N1_W1")
                  e.addAttribute("length",Int.box(10))

                  return g
        }

    val g:Graph = exampleGraph();
    g.display(false);

    val dijkstra:Dijkstra = new Dijkstra(Dijkstra.Element.EDGE, null, "length");

    dijkstra.init(g);

    dijkstra.setSource(g.getNode("N1_S1"));

    println(dijkstra.getPath(g.getNode("N1_W1")));
    val myPath:Path=dijkstra.getPath(g.getNode("N1_W1"))
    val it=(myPath.getEachEdge).asScala
    println("edges")
    it.foreach(println)
}

问题在于 getEachEdge 的原型(prototype)是 getEachEdge[T <: Edge](): Iterable[_ <: T]asScala返回 Iterable[_ <: Nothing] 。所以最后一个问题是“如何访问最短路径的每个元素?”

最佳答案

我不知道为什么,但你必须显式注释类型。

myPath.getEachEdge[Edge].asScala

如果指定了错误的子类型,则可能会出现运行时强制转换异常。

以下抛出 ClassCastException:

@ trait OtherEdge extends Edge
defined trait OtherEdge
@ myPath.getEachEdge[OtherEdge].asScala.head
java.lang.ClassCastException: org.graphstream.graph.implementations.AbstractEdge cannot be cast to $sess.cmd17$OtherEdge
  $sess.cmd18$.<init>(cmd18.sc:1)
  $sess.cmd18$.<clinit>(cmd18.sc:-1)

关于java - 如何使用 Scala 的 GraphStream 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40319276/

相关文章:

java - 在文本文件中查找字符串。然后得到以下行并需要按索引和子字符串分割

scala - scala中数字序列中的子序列

java - 基本的java打印

java - 如何创建一个 java 应用程序来读取 twitter 提要?

java - CoreNLP MaxentTagger 数据格式错误

使用::for 列表的 scala 匹配案例

java - 如何解析 postman 集合?

graph - 给出 n 个顶点的无向连通图中的最小和最大边数?

python - scikit-learn ExtraTreeClassifier 和 RandomForestClassifier 的图

mysql - 数据库的良好设计会随着时间的推移降低精度分辨率