【问题标题】:How to read a .txt file in JAVA and construct a graph based on that?如何在 JAVA 中读取 .txt 文件并基于该文件构建图形?
【发布时间】:2017-04-28 10:08:34
【问题描述】:

我希望我的程序读取 .txt 文件并基于该文件构建图表。例如,如果在文件中写入 (3,5),则应输出连接第 3 和第 5 个节点的图形。

我现在拥有的是文件阅读器的代码,它读取文件并将我的行存储在字符串列表行中并为 ex 打印。第一行(虽然我不确定我真的需要那个)。我不知道如何继续。任何帮助表示赞赏!

这是我的代码:

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

public class Visualization {

    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new FileReader("my/Path/Here"));
        String str;

        List<String> list = new ArrayList<String>();
        while ((str = in.readLine()) != null) {
            list.add(str);
        }

        String[] stringArr = list.toArray(new String[0]);
        System.out.println(stringArr[1]);
    }
}

P.S 我也尝试使用 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);    
}

}

【问题讨论】:

  • 嗯,你有一个好的开始。您需要找到一个 API 来使用您想要的技术生成图表。顺便说一句,要求 API 或其他场外资源是题外话
  • 我想我会使用 JUNG API。我能够创建一个特定的图形,但我不知道如何转换我的代码,以便从文件中获取顶点和边信息。
  • 如果您不尝试展示您拥有的东西,我们将无法帮助您。我不知道 API,我没有看到任何关于 GUI 的代码,所以我不知道你想要实现什么以及如何实现。见How to Ask
  • 我很抱歉。现在我编辑了我的问题。

标签: java swing graph-theory


【解决方案1】:

你有选择!如果你想直接使用 api,JUNG 已经有一个reader for the GraphML format 可供你使用,只需使用加载方法即可。如果您对图形格式比较灵活,可以尝试使用Gephi,它具有到 GraphML 的导出格式。

如果您对文本格式不太灵活,您仍然可以遍历图表。你被困的部分是解析String。提取边的两个顶点后,如果它们还不是图形的一部分,请添加它们,然后添加它们的边。假设一个格式良好的文件:

Pattern vertexer = Pattern.compile("\\((.*),(.*)\\)");
Integer counter = 1;
while ((str = in.readLine()) != null) {
    Matcher extractor = vertexer.matcher(str);
    Integer source = extractor.group(1);
    Integer target = extractor.group(2);
    g.addVertex(source);
    g.addVertex(target);
    g.addEdge(counter.toString(), source, target);
    counter++;
}

注意:添加源顶点和目标顶点是可以的。 JUNG API 保证代码将运行并且不会产生重复的顶点。方法调用只是返回 false。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    相关资源
    最近更新 更多