2017-05-03 2 views
1

Ich brauche ein Programm, das ein Diagramm basierend auf Informationen in TXT-Datei generiert. Wenn beispielsweise 1,7, 7,6 in Datei geschrieben wird, muss das Programm eine Grafik erstellen, die den ersten und siebten sowie siebten und sechsten Knoten verbindet. Ich denke für den Anfang brauche ich 2 Arrays/Listen, sagen wir, X und Y enthält die ersten und zweiten Werte der Paare jeweils in. TXT-Datei. Ich habe einen Code dafür geschrieben, aber es gibt verschiedene Ausnahmen, mit denen ich nicht umgehen kann. Hier ist sie:Graph Visualisierung in 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(); 
} 
} 

Wenn ich auf einem richtigen Weg bin, bitte helfen Sie mir den Code oben zu beheben und gibt mir Ratschläge, wie fortzusetzen und wie die Umwandlung in Graph dieser Listen. Danke im Voraus!
P.S. Ich habe einen Code geschrieben, der ein Diagramm mit JUNG api erzeugt, aber das Problem ist, dass ich alle Knoten- und Kanteninformationen in Code einschließe, während ich es aus einer TXT-Datei lesen muss. Hier ist der Code:

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

Überprüfen Sie diese Antwort: http://stackoverflow.com/questions/43507283/directed-graph-initialization/43508282#43508282 – sirandy

+0

Vielen Dank. Gibt es eine Möglichkeit, die Ausgabe zu visualisieren und den Graphen zu erstellen? –

+1

Die Ausgabe wird mit dem Aufruf graph.printGraph() in der App-Klasse angezeigt. Um die Zeichenausgabe für Ihr Diagramm zu erhalten, können Sie eine Bibliothek wie jGraphT (http://jgrapht.org/) oder jgraphx (https://github.com/jgraph/jgraphx) verwenden, und es ist immer der schwierige Weg: Machen Sie es eine bloße Hand mit Schaukel. – sirandy

Antwort

0

Ich würde lieber eine Adjazenzliste erstellen. Die erste Liste enthält den Knoten "von" und die zweite Liste enthält die Knoten, mit denen er verbunden ist.

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

Sie müssen jede Liste in der Liste initialisieren, also tun Sie dies für alle Knoten, die Sie benötigen.

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

Wenn Sie zu Adjazenzliste hinzufügen möchten, gehen Sie wie folgt vor:

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

Dann können Sie einfach durch die Liste durchlaufen und eine Grafik von dort ziehen, zum Beispiel:

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

Sie haben das Tag "JUNG" auf Ihre Frage eingefügt. Haben Sie versucht, die JUNG Bibliothek zu verwenden? Es enthält Typen zum Darstellen von Graphen, Lesen von einigen verschiedenen Textdateiformaten und zum Visualisieren von Graphen.

Die Distribution enthält Beispiele und Dokumentation (und es gibt viele Fragen zu StackOverflow in Bezug auf JUNG).

+0

Ja Ich war in der Lage, mein eigenes Diagramm zu erstellen, das alle Knoten- und Kanteninformationen von Hand enthält (ich bearbeite jetzt meine Frage und füge diesen Code ein), aber ich möchte es aus einer Textdatei lesen. –

+0

Ein Beispiel für das Einlesen aus einer Textdatei mit einem Format, das Ihrer Spezifikation ähnelt, finden Sie unter JUNGS PajekNetReader. –