北京地铁线路规划
代码仓库:https://github.com/wreckerU/-
需求分析:https://www.cnblogs.com/wreckerU/p/11550467.html
具体思路
:为了可以使每一个名字都能映射到同一个站点上,我用Hashmap的映射功能来确保每一个名字所对应的站点是同一个。然后我在使用BFS函数进行最小路径的查询
代码测试:
Subway读入文件如下:
1号线 苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨地 南礼士路 复兴门 西单 天安门西 天安门东 王府井 东单 建国门 永安里 国贸 大望路 四惠 四惠东
2号线 西直门 车公庄 阜成门 复兴门 长椿街 宣武门 和平门 前门 崇文门 北京站 建国门 朝阳门 东四十条 东直门 雍和宫 安定门 鼓楼大街 积水潭 西直门
3号线 天宫院 生物医药基地 义和庄 黄村火车站 黄村西大街 清源路 枣园 高米店南 高米店北 西红门 新宫 公益西桥 角门西 马家堡 北京南站 陶然亭 菜市口 宣武门 西单 灵境胡同 西四 平安里 新街口 西直门 动物园 国家图书馆 魏公村 人民大学 海淀黄庄 中关村 北京大学东门 圆明园 西苑 北宫门 安河桥北
5号线 宋家庄 刘家窑 蒲黄榆 天坛东门 磁器口 崇文门 东单 灯市口 东四 张自忠路 北新桥 雍和宫 和平里北街 和平西桥 惠新西街南口 惠新西街北口 大屯桥东 北苑路北 立水桥南 立水桥 天通苑南 天通苑 天通苑
6号线 金安桥 杨庄 西黄村 廖公庄 田村 海淀五路居 慈寿寺 花园桥 白石桥南 车公庄西 车公庄 平安里 北海北 南锣鼓巷 东四 朝阳门 东大桥 呼家楼 金台路 十里堡 青年路 褡裢坡 黄渠 常营 草房 物资学院路 通州北关 通运门 北运河西 北运河东 郝家府 东夏园 潞城
7号线 北京西站 湾子 达官营 广安门内 菜市口 虎坊桥 珠市口 桥湾 磁器口 广渠门内 广渠门外 九龙山 大郊亭 百子湾 化工 南楼梓庄 欢乐谷景区 垡头 双合 焦化厂
8号线 朱辛庄 育知路 平西府 回龙观东大街 霍营 育新 西小口 永泰庄 林萃桥 森林公园南门 奥林匹克公园 奥体中心 北土城 安华桥 安德里北街 鼓楼大街 什刹海 南锣鼓巷 中国美术馆
8号线南段 珠市口 天桥 永定门外 木樨园 海户屯 大红门南 和义 东高地 火箭万源 五福堂 德茂 瀛海
9号线 国家图书馆 白石桥南 白堆子 军事博物馆 北京西站 六里桥东 六里桥 七里庄 丰台东大街 丰台南路 科怡路 丰台科技园 郭公庄
10号线 劲松 双井 国贸 金台夕照 呼家楼 团结湖 农业展览馆 亮马桥 三元桥 太阳宫 芍药居 惠新西街南口 安贞门 北土城 健德门 牡丹园 西土城 知春路 知春里 海淀黄庄 苏州街 巴沟 火器营 长春桥 车道沟 慈寿寺 西钓鱼台 公主坟 莲花桥 六里桥 西局 泥洼 丰台站 首经贸 纪家庙 草桥 角门西 角门东 大红门 石榴庄 宋家庄 成寿寺 分钟寺 十里河 潘家园 劲松
新机场线 草桥 大兴新城 大兴机场
13号线 西直门 大钟寺 知春路 五道口 上地 西二旗 龙泽 回龙观 霍营 立水桥 北苑 望京西 芍药居 光熙门 柳芳 东直门
14号线西端 张郭庄 园博园 大瓦窑 郭庄子 打井 七里庄 西局
14号线东端 北京南站 永定门外 景泰 蒲黄榆 方庄 十里河 北工大西门 平乐园 九龙山 大望路 金台路 朝阳公园 枣营 东风北桥 将台 望京南 阜通 望京 东湖渠 来广营 善各庄
15号线 俸伯 顺义 石门 南法信 后沙峪 花梨坎 国展 孙河 马泉营 崔各庄 望京东 望京 望京西 关庄 大屯路东 安立路 奥林匹克公园 北沙滩 六道口 清华东路西口
16号线 北安河 温阳路 稻香湖路 屯佃 永丰 永丰南 西北旺 马连洼 农大南路 西苑
八通线 四惠 四惠东 高碑店 传媒大学 双桥 管庄 八里桥 通州北苑 果园 九棵树 梨园 临河里 土桥
昌平线 昌平西山口 十三陵景区 昌平 昌平关东 北邵洼 南邵 沙河高教园 沙河 巩华城 朱辛庄 生命科学园 西二旗
亦庄线 宋家庄 肖村 小红门 旧宫 亦庄桥 亦庄文化园 万源街 荣京东街 荣昌东街 同济南路 经海路 次渠南 次渠 亦庄火车站
房山线 郭公庄 大葆台 稻田 长阳 篱笆房 广阳城 良乡大学城北 良乡大学城 良乡大学城西 良乡南关 苏庄 阎村东
机场线 东直门 三元桥 T2航站楼 T3航站楼
s1号线 金安桥 四道桥 桥户营 上岸 栗园庄 小园 石厂
燕房线 燕山 房山城关 饶乐府 马各庄 大石河东 星城 阎村 紫草坞 阎村东
西郊线 香山 植物园 万安 茶棚 颐和园西门 巴沟
1.根据要求我先做了查询操作:
输入-a 13号线 -map subway.txt -o routine.txt时
输出结果是:
查询有效。
2.根据要求我先做了最短路线查询操作:
输入-b 苹果园 大兴机场 -map subway.txt -o routine.txt
输出结果是:
也符合要求。
代码分析:
1.首先我先将subway的地铁信息文件读入。并将他们连接且与各个站点实现映射,先用一个getStation的函数来存储站点信息。
package beihang; import java.io.*; import java.util.*; public class getStation { static class Line { int id; String name; List<String> stations = new ArrayList<String>(); } public static class Station { String name; boolean visited; String preStation; List<String> lineNow = new ArrayList<String>(); List<Station> nextStation = new ArrayList<Station>(); } static List<Line> lines = new ArrayList<Line>(); static List<Station> stations = new ArrayList<Station>(); static HashMap<String, Station> map = new HashMap<>(); public static void getStationByLine(String name, String fileOut) { List<String> ans = new ArrayList<String>(); for (Line line : lines) { if (line.name.equals(name)) { ans = line.stations; break; } } try { FileWriter fileWriter = new FileWriter(fileOut); int index = 0; for (String station : ans) { if (index == 0) { fileWriter.write(station); index = 1; } else { fileWriter.write("->" + station); } } fileWriter.flush(); fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println(); return; } }
2.因为有要求进行最短路线操作,而我采用的是BFS函数,代码如下:
package beihang; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Queue; import beihang.getStation.Station; import beihang.getStation.*; public class BFS { public static void BFS(String st, String ed) { for (Map.Entry<String, Station> entry : getStation.map.entrySet()) { entry.getValue().visited = false; } Queue<String> queue = new LinkedList<>(); queue.add(st); while(!queue.isEmpty()) { String now = queue.poll(); getStation.map.get(now).visited = true; if(now.equals(ed)) { break; } for(Station station : getStation.map.get(now).nextStation) { if( getStation.map.get(station.name).visited==false) { getStation.map.get(station.name).preStation = now; queue.add(station.name); } } } } public static void printPath(String st, String ed, String fileOut) { List<String> list = new ArrayList<>(); String now = ed; int flag = 0; String preLine = ""; while(!now.equals(st)) { list.add(now); now = getStation.map.get(now).preStation; } Collections.reverse(list); try { FileWriter fileWriter = new FileWriter(fileOut); fileWriter.write(list.size() + "\r\n"); fileWriter.write(st); for(int i = 0; i < list.size(); i++) { flag = 0; if( getStation.map.get(list.get(i)).lineNow.size()==1) { fileWriter.write("->" + list.get(i)); } else { int j; for(j = i+1; j < list.size(); j++) { if( getStation.map.get(list.get(j)).lineNow.size()==1) { if(! getStation.map.get(list.get(i)).lineNow.get(0).contains( getStation.map.get(list.get(j)).lineNow.get(0))) { if(preLine.equals( getStation.map.get(list.get(j)).lineNow.get(0))) { fileWriter.write("->" + list.get(i)); } else { fileWriter.write("\r\n"); fileWriter.write( getStation.map.get(list.get(j)).lineNow.get(0) + "\r\n"); preLine = getStation.map.get(list.get(j)).lineNow.get(0); fileWriter.write(list.get(i)); } } break; } } } } fileWriter.flush(); fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } } }
3.最后就是主函数,负责读入txt文件与输出txt文件,同时做一下站点的判断:
package beihang; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import beihang.getStation.Line; import beihang.getStation.Station; public class Subway { public void getSubwayMessage(String fileIn) { try { int cnt = 1; String path = fileIn; BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(path)),"UTF-8")); String getLine = null; while ((getLine = bufferedReader.readLine()) != null) { Line line = new Line(); String[] list = getLine.split(" "); line.id = cnt; line.name = list[0]; for(int i = 1; i < list.length-1; i++) { Station station1 = new Station(); Station station2 = new Station(); if(getStation.map.containsKey(list[i])) { station1 = getStation.map.get(list[i]); getStation.map.remove(list[i]); } else { station1.name = list[i]; station1.visited = false; } if(getStation.map.containsKey(list[i+1])) { station2 = getStation.map.get(list[i+1]); getStation.map.remove(list[i+1]); } else { station2.name = list[i+1]; station2.visited = false; } if(!station1.lineNow.contains(line.name)) { station1.lineNow.add(line.name); } if(!station2.lineNow.contains(line.name)) { station2.lineNow.add(line.name); } if(!station1.nextStation.contains(station2)) { station1.nextStation.add(station2); } if(!station2.nextStation.contains(station1)) { station2.nextStation.add(station1); } station1.preStation = station1.name; station2.preStation = station2.name; getStation.map.put(list[i], station1); getStation.map.put(list[i+1], station2); if (!line.stations.contains(station1.name)) { line.stations.add(station1.name); } if (!line.stations.contains(station2.name)) { line.stations.add(station2.name); } } getStation.lines.add(line); cnt++; } bufferedReader.close(); } catch (Exception e) { System.err.println("read errors: " + e); } return ; } public static void main(String[] args) { Subway solve = new Subway(); String fileIn = ""; String fileOut = ""; String line = ""; String start = ""; String end = ""; for(String s:args) { System.out.print(s); } for(int i = 0; i < args.length; i++){ if(args[i].equals("-map")) { i++; fileIn = args[i]; } if(args[i].equals("-a")) { i++; line = args[i]; } if(args[i].equals("-o")) { i++; fileOut = args[i]; } if(args[i].equals("-b")) { i++; start = args[i]; i++; end = args[i]; } } if(args.length==2) { solve.getSubwayMessage(fileIn); System.out.println("读入的地铁信息如下:"); for(Line line1 : getStation.lines) { System.out.print(line1.name + ":"); for(String s : line1.stations) { System.out.print(" " + s); } System.out.println(); } } else if(args.length==6) { solve.getSubwayMessage(fileIn); int flag = 0; for(Line line1 : getStation.lines) { if(line1.name.equals(line)) { flag = 1; } } if(flag==1) { getStation.getStationByLine(line, fileOut); System.out.println("Successfully output all site results on the route to " + fileOut); } else { System.out.println("北京地铁线路中不存在'" + line + "'线路"); } } else if(args.length==7) { solve.getSubwayMessage(fileIn); int flag1 = 0; int flag2 = 0; for(Line line1 : getStation.lines) { if (line1.stations.contains(start)) { flag1 = 1; } } for(Line line1 : getStation.lines) { if (line1.stations.contains(end)) { flag2 = 1; } } if(flag1==1 && flag2==1) { BFS.BFS(start, end); BFS.printPath(start, end, fileOut); } if(flag1==0) { System.out.println("北京地铁线路中不存在'" + start + "'站点"); } if(flag2==0) { System.out.println("北京地铁线路中不存在'" + end + "'站点"); } } } }