2016-10-29 31 views
0

GraphStream 라이브러리를 사용하여 그래프에서 2 노드 사이의 최단 경로를 찾으려고했습니다. 마지막으로 경로의 가장자리를 인쇄 할 수 있지만 (it.foreach(println)) 한 번에 한 요소에 액세스 할 수 없습니다.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

사용중인 스칼라 버전 다음

ClassCastException를 슬로우? –

답변

2

이유는 확실하지 않지만 유형을 명시 적으로 주석 처리해야합니다.

myPath.getEachEdge[Edge].asScala 

잘못된 하위 유형을 지정하면 런타임 캐스트 예외가 발생할 수 있습니다.

@ 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

또한이 솔루션은 작동합니다! 감사!! –