2013-04-25 7 views
1

나는 (표시가없는 가장자리) JGraphT 0.8.3에서 그래프 A<->B을 간단한 방향성 비 표지를 만들고 싶어 :JGraphT의 간단한 undirected unlabelled graph가 작동하지 않습니까? edgeClass 매개 변수 란 무엇입니까?

$ java -cp 'jgrapht-jdk1.6.jar:.' A 
edges of A: [] 
edges of B: [] 

왜 가장자리의 집합입니다 :

import org.jgrapht.graph.DefaultEdge; 
import org.jgrapht.graph.SimpleGraph; 

class A { 
    public static void main(String[] args) { 
     SimpleGraph<String, String> sg = 
      new SimpleGraph<String, String>(String.class); 
     sg.addVertex("A"); 
     sg.addVertex("B"); 
     sg.addEdge("A", "B"); 
     System.out.println("edges of A: " + sg.edgesOf("A")); 
     System.out.println("edges of B: " + sg.edgesOf("B")); 
    } 
} 

내가이 출력을 얻을 버텍스 AB이 비어 있습니까? 또한 SimpleGraph의 클래스 매개 변수는 무엇입니까? 그것은 가장자리의 유형 인 것 같습니다. 그러나 여기 내 가장자리는 레이블이 지정되지 않았으므로 분명히 중요하지 않습니다. 모든 그래프 클래스는 모서리 클래스 (edgeClass)를 매개 변수로 사용합니다. 문서 edgeClass의 어디에 설명되어 있는지 찾을 수 없습니다.


나는 가장자리에 레이블을 경우 ...

$ java -cp 'jgrapht-jdk1.6.jar:.' A 
edges of A: [an_edge] 
edges of B: [an_edge] 

답변

2

당신이 돈을 한 후 작동 (sg.addEdge("A", "B", "an_edge");addEdge 줄을 변경) ...하지만 난 가장자리에 레이블을하지 않으 발견 가장자리에 라벨을 붙일 필요가 없습니다. 당신의 접근법에서 문제는 그래프에 String을 엣지 타입으로 사용하도록 지시한다는 것입니다. 적절한 표준. 일을 가지 방법은 다음과 같습니다

graph: ([A, B, C], [{A,B}, {B,C}]) 
edges of A: [(A : B)] 
edges of B: [(A : B), (B : C)] 

그래서 코드에서와 같이이 DefaultEdge에 에지 클래스를 전환 할 필요가 문제를 해결하기 위해 :

SimpleGraph<String, DefaultEdge> sg = new SimpleGraph<String, DefaultEdge>(DefaultEdge.class); 
    sg.addVertex("A"); 
    sg.addVertex("B"); 
    sg.addVertex("C"); 
    sg.addEdge("A", "B"); 
    sg.addEdge("B", "C"); 
    System.out.println("graph: " + sg.toString()); 
    System.out.println("edges of A: " + sg.edgesOf("A")); 
    System.out.println("edges of B: " + sg.edgesOf("B")); 

이 당신에게 다음과 같은 출력을 제공 할 것입니다.

+0

하지만 가장자리 클래스도 무엇입니까? 왜 그것은'String'으로 깨지는가? 나는 또한 가장자리 클래스를'Object'로 만들 수 있다는 것을 알아 냈고, 또한 동작 할 것이다. 나는 인터넷과 문서를 꽤 많이 조사했고 그것이 놀랍다는 것을 발견했다. – Dog

+1

a) Edge 클래스는 가장자리에 가중치를 설정하려는 경우 (예 : 여행 컨텍스트에서) 또는 가장자리에 유형을 지정하려는 경우 (예 : 온톨로지) 이러한 업적이 필요하지 않은 경우 DefaultEdge가 적절합니다 대답. b) 문자열을 식별 할 수없는 레이블없이 문자열로 중단되지 않았습니다. graph.toString()은 String 가장자리가있는 경우에도 edge를 보여줍니다 : graph : ([A, B, C], [= {A, B}]). 빈 문자열은 가장자리 식별자입니다. 레이블없이 다른 가장자리를 삽입하면 빈 문자열이 이미 있고 equals 및 hashcode 메소드로 삽입이 작동하므로 설정되지 않습니다. –

+0

오. 그래서 리플렉션을 사용하여'String'의 기본 생성자를 호출합니까? – Dog