2017-05-03 12 views
1

.txt 파일에 포함 된 정보를 기반으로 그래프를 생성하는 프로그램이 필요합니다. 예를 들어, 1,7, 7,6으로 작성된 경우 프로그램은 1, 7, 7 및 6 노드를 연결하는 그래프를 작성해야합니다. 처음에는 두 개의 배열/목록이 있어야한다고 생각합니다. 예를 들어, XY은 각각 .txt 파일에 주어진 쌍의 첫 번째와 두 번째 값을 포함합니다. 이 코드를 작성했지만 처리 할 수없는 다른 예외를 제공합니다. 여기있다 : 나는 올바른 방법에 나는 경우자바의 그래프 시각화

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

public class ReaddFile { 
public static void main(String[] args) throws IOException{ 
    BufferedReader br = new BufferedReader((new FileReader("my/path/here"))); 
    String line=""; 

    List<Integer> list_x = new ArrayList<Integer>(); 
    List<Integer> list_y = new ArrayList<Integer>(); 

    while((line=br.readLine())!=null){ 
     String[] t = line.split(","); 
     int x = Integer.parseInt(t[0]); 
     int y = Integer.parseInt(t[1]); 
     list_x.add(x); 
     list_y.add(y); 
    } 
    br.close(); 
} 
} 

, 위의 코드를 수정하고 나에게 계속하는 방법과 그래프를 그 목록으로 변환하는 방법에 대한 조언을 제공하는 데 도움이 바랍니다. 미리 감사드립니다!
P. JUNG API를 사용하여 그래프를 생성하는 코드를 작성했지만 문제점은 .txt 파일에서 읽어야 할 때 모든 노드와 에지 정보를 코드에 포함한다는 것입니다. 다음은 코드입니다.

import edu.uci.ics.jung.algorithms.layout.*; 
import edu.uci.ics.jung.graph.Graph; 
import edu.uci.ics.jung.graph.SparseMultigraph; 
import edu.uci.ics.jung.visualization.VisualizationViewer; 
import java.awt.*; 
import javax.swing.JFrame; 
public class GraphVis { 
Graph<Integer, String> g; 

public GraphVis() { 

g = new SparseMultigraph<Integer, String>(); 

g.addVertex((Integer) 1); 
g.addVertex((Integer) 2); 
g.addVertex((Integer) 3); 
g.addVertex((Integer) 4); 
g.addVertex((Integer) 5); 
g.addVertex((Integer) 6); 
g.addVertex((Integer) 7); 
g.addVertex((Integer) 8); 
g.addVertex((Integer) 9); 
g.addVertex((Integer) 10); 
g.addVertex((Integer) 11); 
g.addVertex((Integer) 12); 
g.addVertex((Integer) 13); 
g.addVertex((Integer) 14); 

g.addEdge("1", 1,2); 
g.addEdge("2", 2, 6); 
g.addEdge("3", 2, 6); 
g.addEdge("4", 2, 7); 
g.addEdge("5", 2, 7); 
g.addEdge("6", 2,12); 
g.addEdge("7", 2,3); 
g.addEdge("8", 2,3); 
g.addEdge("9", 3,4); 
g.addEdge("10", 3,4); 
g.addEdge("11", 3,6); 
g.addEdge("12", 3,6); 
g.addEdge("13", 3,7); 
g.addEdge("14", 3,7); 
g.addEdge("15", 3,12); 
g.addEdge("16", 4,5); 
g.addEdge("17", 4,13); 
g.addEdge("18", 4,13); 
g.addEdge("19", 4,8); 
g.addEdge("20", 4,12); 
g.addEdge("21", 4,12); 
g.addEdge("22", 4,7); 
g.addEdge("23", 4,7); 
g.addEdge("24", 4,6); 
g.addEdge("25", 4,6); 
g.addEdge("26", 5,12); 
g.addEdge("27", 5,11); 
g.addEdge("28", 5,11); 
g.addEdge("29", 5,13); 
g.addEdge("30", 5,8); 
g.addEdge("31", 5,8); 
g.addEdge("32", 5,9); 
g.addEdge("33", 5,9); 
g.addEdge("34", 5,9); 
g.addEdge("35", 5,14); 
g.addEdge("36", 5,14); 
g.addEdge("37", 5,10); 
g.addEdge("38", 5,10); 
g.addEdge("39", 6,12); 
g.addEdge("40", 6,12); 
g.addEdge("41", 6,12); 
g.addEdge("42", 6,7); 
g.addEdge("43", 6,7); 
} 


public static void main(String[] args) {  
GraphVis sgv = new GraphVis(); 
Layout<Integer, String> layout = new CircleLayout(sgv.g);  
layout.setSize(new Dimension(600,600)); 
VisualizationViewer<Integer,String> vv = new   
VisualizationViewer<Integer,String>(layout);  
vv.setPreferredSize(new Dimension(750,750));  
JFrame frame = new JFrame("Graph View ");  
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
frame.getContentPane().add(vv);  
frame.pack();  
frame.setVisible(true);  
} 
+0

답변 확인 : http://stackoverflow.com/questions/43507283/directed-graph-initialization/43508282#43508282 – sirandy

+0

감사합니다. 출력을 시각화하고 그래프를 그릴 수있는 방법이 있습니까? –

+1

출력은 App 클래스의 graph.printGraph() 호출과 함께 표시됩니다. 그래프의 출력 결과를 얻으려면 jGraphT (http://jgrapht.org/) 또는 jgraphx (https://github.com/jgraph/jgraphx)와 같은 라이브러리를 사용할 수 있으며 항상 어려운 방법입니다. 스윙 맨손. – sirandy

답변

0

나는 오히려 인접 목록을 만들 것입니다. 첫 번째 목록에는 "시작"노드가 포함되고 두 번째 목록에는 연결된 노드가 포함됩니다.

List<List<Integer>> adjacencyList = new ArrayList<>(); 

목록의 각 목록을 초기화해야하므로 필요한 모든 노드에 대해이 작업을 수행해야합니다. 당신이 인접 목록에 추가 할 때

for (int i = 0; i < numberOfNodes; i++) { 
    adjacencyList.add(new ArrayList<>()); 
} 

, 다음을 수행하십시오

adjacencyList.get(x).add(y); 
adjacencyList.get(y).add(x); // Add this if you need an undirected graph 

그런 다음 당신은 단순히 예를 들어, 목록을 반복하고 거기에서 그래프를 그릴 수 있습니다 :

for (int i = 0; i < numberOfNodes; i++) { 
    boolean[] visited = new boolean[numberOfNodes]; 
    for (int node : adjacencyList.get(i)) { 
    ... 
    } 
} 
0

질문에 "JUNG"태그가 포함되었습니다. JUNG 라이브러리를 사용해 보셨습니까? 여기에는 그래프를 표현하고, 여러 텍스트 파일 형식에서 텍스트를 읽고, 시각화하기위한 유형이 포함됩니다.

배포판에는 샘플과 문서가 포함되어 있습니다 (Jung과 관련된 StackOverflow에는 많은 질문이 있습니다).

+0

예 직접 모든 노드 및 가장자리 정보를 제공하는 그래프를 만들 수 있었지만 이제는 질문을 편집하고 해당 코드를 포함시킵니다.하지만 원하는 것은 텍스트 파일에서 읽는 것입니다. –

+0

사양과 비슷한 형식의 텍스트 파일을 읽는 예제는 Jung의 PajekNetReader를 참조하십시오. –