0

我必须从文本文件创建加权图。下面是文本文件的外观示例。第一个数字是实际火车站的 ID。第二个数字是可能的目的地,逗号后面是时间(以秒为单位),它需要旅行。第三个数字是另一个可能的目的地。

060060101832 060063101842,78 060054104822,90
060054104822 060060101832,90 060057104812,90 060058101502,90 060054105611,66
060057104812 060054104822,90 060057102802,72 

我想将路线存储在 ArrayList 中。每个路由对象应如下所示:

Start: 060060101832 
Destination: 060063101842
Time: 78

问题是,我必须为同一个起始位置存储多条路线。如何使用扫描仪正确读取线条?我的方法是这样的:

while (routes.hasNext()) {
        routes.useDelimiter(",| |\\n");
        String start = routes.next();
        String dest= routes.next();
        String time= routes.next();
        Edge edge = new Edge(start, dest, time);
        edges.add(edge);
    }

由于我无法返回文本文件,我无法想象正确的解决方案应该是什么样子。

4

1 回答 1

2

不是一个完整的代码,也没有经过测试。它可能有效,也可能无效,但无论如何它都会指导你。

// Java 8
Node n;
Edge e;
String[] splittedLine;
String[] splittedEdge;
HashMap<String, Node> stationNumberToNode = new HashMap<>();
// if the file is not too large, you can read the file at once
List<String> lines = Files.readAllLines(new File("path/to/file.txt").getPath());
for(String line : lines){
  splittedLine = line.split(" ");
  if((n = stationNumberToNode.get(splittedLine[0]) == null){
    n = new Node(splittedLine[0]); // assuming your Node has a constructor that takes the station id
    stationNumberToNode.put(stationNumberToNode[0], n);
  }
  for(int i = 1; i < splittedLine.lenght; ++i){
    splittedEdge = splittedLine[i].split(",");
    e = new Edge(splittedEdge[0], splittedEdge[1]); // assuming your Edgehas a constructor that takes the destination station and the cost
    n.addEdge(e);
  }
}

解释

Node n;
Edge e;
String[] splittedLine;
String[] splittedEdge;
HashMap<String, Node> stationNumberToNode = new HashMap<>();

理想情况下,您应该始终在循环之外声明变量,这样您就可以避免在每次迭代时分配新内存。因此,我们在进入循环之前声明了 5 个变量。HashMap此处用于涵盖您的输入并不总是分组并且您避免每次都执行列表搜索的情况。

List<String> lines = Files.readAllLines(new File("path/to/file.txt").getPath());

一次读取文件中的所有行。或者,根据问题的要求,您可以使用Scannerlike on this anwer读取文件。但是,您必须更改迭代行的方式。

splittedLine = line.split(" ");

拆分“”上的行,因为您的输入文件格式正确。

if((n = stationNumberToNode.get(splittedLine[0]) == null){
  n = new Node(splittedLine[0]); // assuming your Node has a constructor that takes the station id
  stationNumberToNode.put(stationNumberToNode[0], n);
}

检查当前节点是否已经在HashMap. 如果是,它将存储在变量中n。否则,它将Node使用当前 id 创建一个并将其添加到我们的HashMap.

for(int i = 1; i < splittedLine.lenght; ++i){
  splittedEdge = splittedLine[i].split(",");
  e = new Edge(splittedEdge[0], splittedEdge[1]); // assuming your Edgehas a constructor that takes the destination station and the cost
  n.addEdge(e);
}

由于输入文件中的所有内容都是目标站及其成本(id,cost),因此我们splittedLine从索引 1 开始迭代。对于每个边缘数据,我们根据“,”(来自您的输入文件)进行拆分,而splittedEdge[0]将是目标 id,并且splittedEdge[1]将是该目标的成本。我们使用该信息创建一个Edge并将其添加EdgeNode对象中。

于 2017-06-26T17:33:14.620 回答