北京地铁线路查询
一、gethub链接:
https://github.com/standandby/BJsubway
二、基本需求
1.获取所以的站点信息
输入格式为 java -map subway.txt
2.获取北京地铁单条线路上的所以站点
输入为 java -a 线路名称 -map subway.txt -o line.txt
3.获取两个站点之间的最短路线
输入为 java -b 站点名 站点名 -map subway.txt-o station.txt
三、文件导入
附一张北京地铁的线路图:
subway.txt的内容样例如下所示:
导入代码如下
public static void readFile() { //读取地铁线路图信息 File file = new File(readFile); BufferedReader reader = null; try { InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file), "UTF-8"); reader = new BufferedReader(inputStreamReader); String line = null; String linename = "1"; while ((line = reader.readLine()) != null) { if (line.trim().startsWith("*")) { String[] lineInfo = line.substring(1).split("-"); lineSet.add(getLine(lineInfo[1].trim(), lineInfo[0].trim())); } } } catch (IOException e) {e.printStackTrace();}
finally {} }
导入完成后是将指定位置的subway.txt导入到程序文件中
四、主要函数
这里的主要函数就是求最短路径的具体函数,本来是想用Dijkstra算法,参考了网上的代码,但都不怎么合适,最后还是改用了广度优先算法来写,勉强算满足要求,具体代码如下:
private void BFS(Graph g, Station gg) {
//查找最短路径 Queue<Station> queue = new LinkedList<>(); visitedV.add(gg);//设置起始站点,即输入的站点 queue.add(gg);//将站点入栈 while (false == queue.isEmpty()) { Station ver = queue.poll(); List<Station> toBeVisitedV = g.getV_edgeList_map().get(ver); for (Station v : toBeVisitedV) { if (false == visitedV.contains(v)) { visitedV.add(v); path.put(v, ver); queue.add(v); } } } }
五、测试样例
1.存在的线路输出
java -a 1号线 -map subway.txt -o station.txt
输出结果:
2.邻接站点之间的最短距离
java -b 苹果园 古城 -map subway.txt -o line.txt
输出为:
3.较远站点之间(含转线)的最短距离
java -b 站点名 站点名 -map subway.txt -o line.txt
输出结果:
六、异常处理
1.输入的线路不存在,输出“线路不存在”
2.输入的站点不存在,输出“站点不存在”
3.输入的站点相同,输出“站点相同”
4.输入命令格式或名称错误,输出“格式/名称错误”
总结
本次实验的难点主要就是最短路径的计算,因为我基础比较差,所以花了很多时间去学习,导致花在工程上的时间不够多,质量有待提高,以后要更好的去规划时间。
原文:https://www.cnblogs.com/standby0630/p/11673225.html