首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将GraphStream库用于Scala

如何将GraphStream库用于Scala
EN

Stack Overflow用户
提问于 2016-10-29 12:52:17
回答 2查看 474关注 0票数 0

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

代码语言:javascript
复制
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的原型是getEachEdge[T <: Edge](): Iterable[_ <: T]asScala返回一个Iterable[_ <: Nothing]。因此,最后一个问题是“我如何访问最短路径的每个元素?”

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-14 14:17:55

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

代码语言:javascript
复制
myPath.getEachEdge[Edge].asScala

如果指定了错误的子类型,则可以获得运行时强制转换异常。

以下抛出一个ClassCastException:

代码语言:javascript
复制
@ 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)
票数 2
EN

Stack Overflow用户

发布于 2016-11-14 14:19:04

尝试使用类型注释帮助编译器:

代码语言:javascript
复制
val it: Iterable[Edge] = myPath.getEachEdge.asScala
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40319276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档