簡體   English   中英

如何將GraphStream庫用於Scala

[英]How to use the GraphStream library for Scala

我試圖使用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的原型是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)

嘗試使用類型注釋幫助編譯器:

val it: Iterable[Edge] = myPath.getEachEdge.asScala

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM