有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

图形java,如何阅读一个图形。包含多行不同整数数的txt文件

我有一本书。txt文件,每行的格式如下

1 2,10 3,20

2 6,87
. .

该文件实际上表示一个图,第1行表示顶点1的边指向顶点2,长度为10,顶点1的边指向顶点3,长度为20。第2行表示顶点2只有一条指向顶点6的边,长度为87

我想做Dajkstra的最短路径算法。我不想定义顶点类、边类等,而是想将每条线存储到一个二维数组中,这样通过使用索引,我就可以得到图形信息。如果是python,我会将整个文件存储到一个嵌套列表[(2,10)(3,20)],[(6,87)],…],因此,无需创建顶点、边类,我可以通过索引列表轻松访问所有必要的图形信息

我的问题是,如何在Java中实现这一点?二维数组不好,因为每行可能有不同数量的整数。ArrayList可能不错,但是如何将整个txt文件有效地读入这样的ArrayList呢


共 (2) 个答案

  1. # 1 楼答案

    尝试以下方法:

    public Map<Integer, Map<Integer, Integer>> process(String filePath) throws IOException {
        Map<Integer, Map<Integer, Integer>> graph = new HashMap<>();
    
        Files.lines(new File(filePath).toPath())
                .map(line -> line.split(" "))
                .map(Arrays::asList)
                .forEachOrdered(elements -> {
                    int vertexId = parseInt(elements.get(0));
    
                    Map<Integer, Integer> vertexMap = new HashMap<>();
                    elements.subList(1, elements.size()).stream()
                            .map(element -> element.split(","))
                            .map(Arrays::asList)
                            .forEach(pair -> vertexMap.put(parseInt(pair.get(0)), parseInt(pair.get(1))));
    
                    graph.put(vertexId, vertexMap);
                });
    
    
        return graph;
    }
    

    我返回了一个Map而不是List,因为按索引工作是一种不好的做法,您可以获得相同的功能

    还请注意,这是没有测试-它可能不工作,但我认为它会

  2. # 2 楼答案

        ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>(); 
    
        try{
    
                Scanner sc = new Scanner(new File("a.txt"));               
                while(sc.hasNextLine()){
                String line= sc.nextLine();             
                ArrayList<Integer> vertex = new ArrayList<Integer>();               
                Scanner lineContents = new Scanner(line).useDelimiter("\\D"); //"\\D" means any none digit
    
                while (lineContents.hasNext()) {
                        vertex.add(lineContents.nextInt());
                }
    
                graph.add(vertex);
                lineContents.close();
            }
            sc.close();
        }