2017-05-03 19 views
1

.txtファイルに含まれる情報に基づいてグラフを生成するプログラムが必要です。たとえば、1,77,6と書かれている場合、プログラムは1番目と7番目、7番目と6番目のノードを結ぶグラフを作成する必要があります。 私は始めに、2つの配列/リストを持っていなければならないと思います。XYそれぞれ.txtファイルで与えられたペアの第1と第2の値が入っています。私はこれのためのコードを書いたが、私は扱うことができない異なる例外を与える。ここにある:私は、正しい方法で午前場合Javaでのグラフの可視化

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

私はむしろ隣接関係リストを作成します。最初のリストには「from」ノードが含まれ、2番目のリストには接続先ノードが含まれます。

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を参照してください。 –

関連する問題