这不是一个完整的代码,也没有经过测试。它可能有效,也可能无效,但无论如何它都会指导你。
// 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());
一次读取文件中的所有行。或者,根据问题的要求,您可以使用Scanner
like 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
并将其添加Edge
到Node
对象中。