簡體   English   中英

JAVA中的圖形可視化

[英]Graph visualisation in JAVA

我需要一個程序,它根據.txt文件中包含的信息生成圖表。 例如,如果是寫1,7,7,6項文件,程序必須建立連結第1和第7,和第7和第6節點的圖。 我認為一開始我需要有2個數組/列表,比如說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();  
}
}

如果我正確的方式,請幫助我修復上面的代碼,並給我關於如何繼續以及如何將這些列表轉換為圖表的建議。 提前致謝!
PS我編寫了一個使用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);    
}

我寧願創建一個鄰接列表。 第一個列表包含“from”節點,第二個列表包含它連接的節點。

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)) {
    ...
  }
}

您在問題中加入了“JUNG”標簽。 你試過使用JUNG庫嗎? 它包括用於表示圖形的類型,從幾種不同的文本文件格式中讀取它們以及用於可視化它們的類型。

分發包括樣本和文檔(與JUNG相關的StackOverflow有很多問題)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM