2016-10-29 45 views
0

GraphStreamライブラリを使用してグラフ内の2つのノード間の最短経路を見つけようとしました。最後に私はパス(it.foreach(println))の端を印刷することができますが、私はその時点で1つの要素にアクセスすることはできません。これはコードです:ScalaのGraphStreamライブラリの使用方法

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]であるということです。最後の質問は「どのように最短パスの各要素にアクセスできますか?」です。

+0

あなたはどのScalaのバージョンを使用していますか? –

答えて

2

理由はわかりませんが、明示的に注釈を付ける必要があります。

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) 
+0

それは動作します!あなたは私の命を救いました!! –

1

は、型注釈でコンパイラを支援してみてください。

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

また、このソリューションは動作します!ありがとう!! –

関連する問題