2016-10-29 9 views
0

Ich habe versucht, die GraphStream-Bibliothek zu verwenden, um den kürzesten Pfad zwischen zwei Knoten in einem Diagramm zu finden. Am Ende kann ich die Kanten des Pfades drucken (it.foreach(println)), aber ich kann nicht auf ein Element zu der Zeit zugreifen. Dies ist der Code:Verwendung der GraphStream-Bibliothek für Scala

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) 
} 

Das Problem ist, dass der Prototyp von getEachEdge ist getEachEdge[T <: Edge](): Iterable[_ <: T] und asScala kehrt ein Iterable[_ <: Nothing]. Die letzte Frage lautet also: "Wie kann ich auf jedes Element des kürzesten Pfads zugreifen?"

+0

Welche scala-Version verwenden? –

Antwort

2

Ich bin mir nicht sicher warum, aber Sie müssen den Typ explizit kommentieren.

Sie könnten Runtime-Cast-Ausnahmen erhalten, wenn Sie den falschen Subtyp angeben.

Die folgende wirft einen Classcast:

@ 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

Es funktioniert! Du hast mein Leben gerettet!! –

1

Versuchen Sie, den Compiler mit einer Typanmerkung helfen:

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

Auch diese Lösung funktioniert !! Vielen Dank!! –

Verwandte Themen