github https://github.com/wangwenbo31701081/subway
需求概要
1.需要存储地铁信息
2.设计读取地铁信息的命令行
3.需要能输出查询到目的地的所有途经的地铁站点
4.能够算出两个地点间最短路线
5.能够进行性能检测
模块介绍
1.文件subway.txt读取和数据读取 FileOperate.java FileOperateOp.java
2.换站转乘最短路径算法 FloydInGraph GetStation.java Relative.java
3.输入输出 Subway.java
输入格式
1.实现地铁线路的加载
-map subway.txt
//将存储在subway.txt文件里的地铁线路进行读取
2.实现查询指定线路所有站点
-a 地铁线路名称 -map subway.txt -o station.txt
3.实现查询指定两个站点间的最短路径
-b 起始站点 目的站点 -map subway.txt -o routine.txt
文件数据读入
class FileOperate { public List<String> getFile(String path){ List<String> line = new ArrayList(); try { File file = new File(path); InputStream in = new FileInputStream(file); Reader reader = new InputStreamReader(in, "utf-8"); BufferedReader br = new BufferedReader(reader); String s; while ((s = br.readLine()) != null) { line.add(s); } br.close(); } catch (Exception e) { e.printStackTrace(); } return line; }
public List<String> getFileSpecLine(String path1,int startNum,int endNum){ List<String> line=new ArrayList(); for(int i=startNum;i<endNum;i++){ line.add(getFile(path1).get(i)); } return line; } public void writeFile(String line1,String path1){ try { FileWriter writer=new FileWriter(path1); BufferedWriter bw=new BufferedWriter(writer); bw.write(line1); bw.close(); }catch(Exception e){ e.printStackTrace(); } }
最短路径算法
class FloydInGraph { private static int INF = Integer.MAX_VALUE; //dist[i][j]=INF<==>i 和 j之间没有边 private int[][] dist; //顶点i 到 j的最短路径长度,初值是i到j的边的权重 private int[][] path; public int [] path1; private List<Integer> result = new ArrayList<Integer>(); public List<Integer> getPath(int num1,int num2) { FloydInGraph graph = new FloydInGraph(15); int i=0; int[][] matrix = /* {{INF, 30, INF, 10, 50}, {INF, INF, 60, INF, INF}, {INF, INF, INF, INF, INF}, {INF, INF, INF, INF, 30}, {50, INF, 40, INF, INF},};*/ {{INF,INF,2,4,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF}, {INF,INF,INF,INF,3,2,INF,INF,INF,INF,INF,INF,INF,INF,INF}, {INF,6,INF,INF,INF,INF,3,INF,INF,INF,INF,INF,INF,INF,INF}, {INF,INF,3,INF,INF,INF,INF,3,INF,INF,INF,INF,INF,INF,INF}, {INF,INF,INF,INF,INF,2,INF,INF,INF,INF,5,INF,INF,INF,INF}, {INF,INF,INF,INF,INF,INF,4,INF,4,INF,INF,INF,INF,INF,INF}, {INF,INF,INF,INF,INF,INF,INF,3,3,3,INF,INF,INF,INF,INF}, { INF,INF,INF,INF,INF,INF,INF,INF,INF,3,INF,INF,INF,INF,INF}, { INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,5,2,INF,INF,INF}, { INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,1,INF,INF,INF}, {INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,4,INF,INF}, {INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,2}, {INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,1,INF}, {INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,1,INF,1}, {INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,1,INF},}; int begin = num1; int end = num2; graph.findCheapestPath(begin, end, matrix); List<Integer> list = graph.result; /* System.out.println(begin + " to " + end + ",the cheapest path is:"); System.out.println(list.toString()); System.out.println(graph.dist[begin][end]);*/ Iterator it=list.iterator(); /* while(it.hasNext()){ Object obj=it.next(); System.out.println(obj); }*/ return list; } void findCheapestPath(int begin, int end, int[][] matrix) { floyd(matrix); result.add(begin); findPath(begin, end); result.add(end); } void findPath(int i, int j) { int k = path[i][j]; if (k == -1) { return; } findPath(i, k); //递归 result.add(k); findPath(k, j); } void floyd(int[][] matrix) { int size = matrix.length; //initialize dist and path for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { path[i][j] = -1; dist[i][j] = matrix[i][j]; } } for (int k = 0; k < size; k++) { for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { if (dist[i][k] != INF && dist[k][j] != INF && dist[i][k] + dist[k][j] < dist[i][j]) { dist[i][j] = dist[i][k] + dist[k][j]; path[i][j] = k; } } } } } public FloydInGraph(int size) { this.path = new int[size][size]; this.dist = new int[size][size]; } }
规定内容格式
public FileOperateOp(String str, String str1, String str2, String str3, String str4, String str5) { if(str.equals("-a") && str4.equals("-o") && str2.equals("-map")){ char ch=str1.charAt(0); switch(ch){ case '1' : {getFilePrint(str3,0);writeFile(getFile(str3).get(0),str5);break;} case '2' : {getFilePrint(str3,1);writeFile(getFile(str3).get(1),str5);break;} ...... ...... default:System.out.println("error"); } }else{ System.out.println("command error!"); } }
读入的文本文件(其中f代表普通站点,t代表转乘站点,站点间用空格分隔):
1号线: 苹果园 f 古城 f 八角游乐园 f 八宝山 f 玉泉路 f 五棵松 f 万寿路 f 公主坟 t 军事博物馆 t 木樨地 f 南礼士路 f 复兴门 t 西单 t 天安门西 f 天安门东 f 王府井 f 东单 t 建国门 t 永安里 f 国贸 t 大望路 t 四惠 t 四惠东 t 2号线: 积水潭 t 鼓楼大街 t 安定门 f 雍和宫 t 东直门 t 东四十条 f 朝阳门 t 建国门 t 北京站 f 崇文门 t 前门 f 和平门 f 宣武门 t 长椿街 f 复兴门 t 阜成门 f 车公庄 t 西直门 t 积水潭 t 4号线大兴线: 安河桥北 f 北宫门 f 西苑 t 圆明园 f 北京大学东门 f 中关村 f 海淀黄庄 t 人民大学 f 魏公村 f 国家图书馆 t 动物园 f 西直门 t 新街口 f 平安里 t 西四 f 灵境胡同 f 西单 t 宣武门 t 菜市口 t 陶然亭 f 北京南站 t 马家堡 f 角门西 t 公益西桥 f 新宫 f 西红门 f 高米店北 f 高米店南 f 枣园 f 清源路 f 黄村西大街 f 黄村火车站 f 义和庄 f 生物医药基地 f 天宫院 f 5号线: 天通苑北 f 天通苑 f 天通苑南 f 立水桥 t 立水桥南 f 北苑路北 f 大屯路东 t 惠新西街北口 f 惠新西街南口 t 和平西桥 f 和平里北桥 f 雍和宫 t 北新桥 f 张自忠路 f 东四 t 灯市口 f 东单 t 崇文门 t 磁器口 t 天坛东门 f 蒲黄榆 t 刘家窑 f 宋家庄 t 6号线: 金安桥 t 杨庄 f 西黄村 f 廖公庄 f 田村 f 海淀五路居 f 慈寿寺 t 花园桥 f 白石桥南 t 车公庄西 f 车公庄 t 平安里 t 北海北 f 南锣鼓巷 t 东四 t 朝阳门 t 东大桥 f 呼家楼 t 金台路 t 十里堡 f 青年路 f 褡裢坡 f 黄渠 f 常营 f 草房 f 物资学院路 f 通州北关 f 北运河西 f 北运河东 f 郝家府 f 东夏园 f 潞城 f 7号线: 北京西站 t 湾子 f 达官营 f 广安门内 f 菜市口 t 虎坊桥 f 珠市口 t 桥湾 f 磁器口 t 广渠门内 f 广渠门外 f 九龙山 t 大郊亭 f 百子湾 f 化工 f 南楼梓庄 f 欢乐谷景区 f 垡头 f 双合 f 焦化厂 f 8号线: 朱辛庄 t 育知路 f 平西府 f 回龙观东大街 f 霍营 t 育新 f 西小口 f 永泰庄 f 林萃桥 f 森林公园南门 f 奥林匹克公园 t 奥体中心 f 北土城 t 安华桥 f 安德里北街 f 鼓楼大街 t 什刹海 f 南锣鼓巷 t 中国美术馆 f 8号线南段: 珠市口 t 天桥 f 永定门外 t 木樨园 f 海户屯 f 大红门南 f 和义 f 东高地 f 火箭万源 f 五福堂 f 德茂 f 瀛海 f 9号线: 国家图书馆 t 白石桥南 t 白堆子 f 军事博物馆 t 北京西站 t 六里桥东 f 六里桥 t 七里庄 t 丰台东大街 f 丰台南路 f 科怡路 f 丰台科技园 f 郭公庄 t 10号线: 巴沟 t 苏州街 f 海淀黄庄 t 知春里 f 知春路 f 西土城 f 牡丹园 f 健德门 f 北土城 t 安贞门 f 惠新西街南口 t 芍药居 t 太阳宫 f 三元桥 t 亮马桥 f 农业展览馆 f 团结湖 f 呼家楼 t 金台夕照 f 国贸 t 双井 f 劲松 f 潘家园 f 十里河 t 分钟寺 f 成寿寺 f 宋家庄 t 石榴庄 f 大红门 f 角门东 f 角门西 t 草桥 t 纪家庙 f 首经贸 f 丰台站 f 泥洼 f 西局 t 六里桥 t 莲花桥 f 公主坟 t 西钓鱼台 f 慈寿寺 t 车道沟 f 长春桥 f 火器营 f 巴沟 t 13号线: 西直门 t 大钟寺 f 知春路 f 五道口 f 上地 f 西二旗 t 龙泽 f 回龙观 f 霍营 t 立水桥 t 北苑 f 望京西 t 芍药居 t 光熙门 f 柳芳 f 东直门 t 14号线西段: 张郭庄 f 园博园 f 大瓦窑 f 郭庄子 f 大井 f 七里庄 t 西局 t 14号线东段: 北京南站 t 永定门外 t 景泰 f 蒲黄榆 t 方庄 f 十里河 t 北工大西门 f 平乐园 f 九龙山 t 大望路 t 金台路 t 朝阳公园 f 枣营 f 东风北桥 f 将台 f 望京南 f 阜通 f 望京 t 东湖渠 f 来广营 f 善各庄 f 15号线: 清华东路西口 f 六道口 f 北沙滩 f 奥林匹克公园 t 安立路 f 大屯路东 t 关庄 f 望京西 t 望京 t 望京东 f 崔各庄 f 马泉营 f 孙河 f 国展 f 花梨坎 f 后沙峪 f 南法信 f 石门 f 顺义 f 俸伯 f 16号线: 北安河 f 温阳路 f 稻香湖路 f 屯佃 f 永丰 f 永丰南 f 西北旺 f 马连洼 f 农大南路 f 西苑 t 八通线: 四惠 t 四惠东 t 高碑店 f 传媒大学 f 双桥 f 管庄八里桥 f 通州北苑 f 果园 f 九棵树 f 梨园 f 临河里 f 北桥 f 昌平线: 昌平西山口 f 十三陵景区 f 昌平 f 昌平东关 f 北邵洼 f 南邵 f 沙河高教区 f 沙河 f 巩华城 f 朱辛庄 t 生命科学园 f 西二旗 t 亦庄线: 宋家庄 t 肖村 f 小红门 f 旧宫 f 亦庄桥 f 亦庄文化园 f 万源街 f 容京东街 f 荣昌东街 f 同济南路 f 经海路 f 次渠南 f 次渠 f 亦庄火车站 f 房山线: 郭公庄 t 大葆台 f 稻田 f 长阳 f 篱笆房 f 广阳城 f 良乡大学城北 f 良乡大学城 f 良乡大学城西 f 良乡南关 f 苏庄 f 阎村东 t 机场线: 东直门 t 三元桥 t T2/T3航站楼 f s1线: 石厂 f 小园 f 栗园庄 f 上岸 f 桥户营 f 四道桥 f 金安桥 t 燕房线: 燕山 f 房山城关 f 饶乐府 f 马各庄 f 大石河东 f 星城 f 阎村 f 紫草坞 f 阎村东 t 西郊线: 香山 f 植物园 t 万安 f 茶棚 f 颐和园西门 f 巴沟 t 新机场线: 草桥 t 大兴新城 f 大兴机场 f
读入所有的地铁线路和地铁站点 -map
功能1 1号线: 苹果园 -> 古城 -> 八角游乐园 -> 八宝山 -> 玉泉路 -> 五棵松 -> 万寿路 -> 公主坟 -> 军事博物馆 -> 木樨地 -> 南礼士路 -> 复兴门 -> 西单 -> 天安门西 -> 天安门东 -> 王府井 -> 东单 -> 建国门 -> 永安里 -> 国贸 -> 大望路 -> 四惠 -> 四惠东 -> 2号线: 积水潭 -> 鼓楼大街 -> 安定门 -> 雍和宫 -> 东直门 -> 东四十条 -> 朝阳门 -> 建国门 -> 北京站 -> 崇文门 -> 前门 -> 和平门 -> 宣武门 -> 长椿街 -> 复兴门 -> 阜成门 -> 车公庄 -> 西直门 -> 积水潭 -> 4号线大兴线: 安河桥北 -> 北宫门 -> 西苑 -> 圆明园 -> 北京大学东门 -> 中关村 -> 海淀黄庄 -> 人民大学 -> 魏公村 -> 国家图书馆 -> 动物园 -> 西直门 -> 新街口 -> 平安里 -> 西四 -> 灵境胡同 -> 西单 -> 宣武门 -> 菜市口 -> 陶然亭 -> 北京南站 -> 马家堡 -> 角门西 -> 公益西桥 -> 新宫 -> 西红门 -> 高米店北 -> 高米店南 -> 枣园 -> 清源路 -> 黄村西大街 -> 黄村火车站 -> 义和庄 -> 生物医药基地 -> 天宫院 -> 5号线: 天通苑北 -> 天通苑 -> 天通苑南 -> 立水桥 -> 立水桥南 -> 北苑路北 -> 大屯路东 -> 惠新西街北口 -> 惠新西街南口 -> 和平西桥 -> 和平里北桥 -> 雍和宫 -> 北新桥 -> 张自忠路 -> 东四 -> 灯市口 -> 东单 -> 崇文门 -> 磁器口 -> 天坛东门 -> 蒲黄榆 -> 刘家窑 -> 宋家庄 -> 6号线: 金安桥 -> 杨庄 -> 西黄村 -> 廖公庄 -> 田村 -> 海淀五路居 -> 慈寿寺 -> 花园桥 -> 白石桥南 -> 车公庄西 -> 车公庄 -> 平安里 -> 北海北 -> 南锣鼓巷 -> 东四 -> 朝阳门 -> 东大桥 -> 呼家楼 -> 金台路 -> 十里堡 -> 青年路 -> 褡裢坡 -> 黄渠 -> 常营 -> 草房 -> 物资学院路 -> 通州北关 -> 北运河西 -> 北运河东 -> 郝家府 -> 东夏园 -> 潞城 -> 7号线: 北京西站 -> 湾子 -> 达官营 -> 广安门内 -> 菜市口 -> 虎坊桥 -> 珠市口 -> 桥湾 -> 磁器口 -> 广渠门内 -> 广渠门外 -> 九龙山 -> 大郊亭 -> 百子湾 -> 化工 -> 南楼梓庄 -> 欢乐谷景区 -> 垡头 -> 双合 -> 焦化厂 -> 8号线: 朱辛庄 -> 育知路 -> 平西府 -> 回龙观东大街 -> 霍营 -> 育新 -> 西小口 -> 永泰庄 -> 林萃桥 -> 森林公园南门 -> 奥林匹克公园 -> 奥体中心 -> 北土城 -> 安华桥 -> 安德里北街 -> 鼓楼大街 -> 什刹海 -> 南锣鼓巷 -> 中国美术馆 -> 8号线南段: 珠市口 -> 天桥 -> 永定门外 -> 木樨园 -> 海户屯 -> 大红门南 -> 和义 -> 东高地 -> 火箭万源 -> 五福堂 -> 德茂 -> 瀛海 -> 9号线: 国家图书馆 -> 白石桥南 -> 白堆子 -> 军事博物馆 -> 北京西站 -> 六里桥东 -> 六里桥 -> 七里庄 -> 丰台东大街 -> 丰台南路 -> 科怡路 -> 丰台科技园 -> 郭公庄 -> 10号线: 巴沟 -> 苏州街 -> 海淀黄庄 -> 知春里 -> 知春路 -> 西土城 -> 牡丹园 -> 健德门 -> 北土城 -> 安贞门 -> 惠新西街南口 -> 芍药居 -> 太阳宫 -> 三元桥 -> 亮马桥 -> 农业展览馆 -> 团结湖 -> 呼家楼 -> 金台夕照 -> 国贸 -> 双井 -> 劲松 -> 潘家园 -> 十里河 -> 分钟寺 -> 成寿寺 -> 宋家庄 -> 石榴庄 -> 大红门 -> 角门东 -> 角门西 -> 草桥 -> 纪家庙 -> 首经贸 -> 丰台站 -> 泥洼 -> 西局 -> 六里桥 -> 莲花桥 -> 公主坟 -> 西钓鱼台 -> 慈寿寺 -> 车道沟 -> 长春桥 -> 火器营 -> 巴沟 -> 13号线: 西直门 -> 大钟寺 -> 知春路 -> 五道口 -> 上地 -> 西二旗 -> 龙泽 -> 回龙观 -> 霍营 -> 立水桥 -> 北苑 -> 望京西 -> 芍药居 -> 光熙门 -> 柳芳 -> 东直门 -> 14号线西段: 张郭庄 -> 园博园 -> 大瓦窑 -> 郭庄子 -> 大井 -> 七里庄 -> 西局 -> 14号线东段: 北京南站 -> 永定门外 -> 景泰 -> 蒲黄榆 -> 方庄 -> 十里河 -> 北工大西门 -> 平乐园 -> 九龙山 -> 大望路 -> 金台路 -> 朝阳公园 -> 枣营 -> 东风北桥 -> 将台 -> 望京南 -> 阜通 -> 望京 -> 东湖渠 -> 来广营 -> 善各庄 -> 15号线: 清华东路西口 -> 六道口 -> 北沙滩 -> 奥林匹克公园 -> 安立路 -> 大屯路东 -> 关庄 -> 望京西 -> 望京 -> 望京东 -> 崔各庄 -> 马泉营 -> 孙河 -> 国展 -> 花梨坎 -> 后沙峪 -> 南法信 -> 石门 -> 顺义 -> 俸伯 -> 16号线: 北安河 -> 温阳路 -> 稻香湖路 -> 屯佃 -> 永丰 -> 永丰南 -> 西北旺 -> 马连洼 -> 农大南路 -> 西苑 -> 八通线: 四惠 -> 四惠东 -> 高碑店 -> 传媒大学 -> 双桥 -> 管庄八里桥 -> 通州北苑 -> 果园 -> 九棵树 -> 梨园 -> 临河里 -> 北桥 -> 昌平线: 昌平西山口 -> 十三陵景区 -> 昌平 -> 昌平东关 -> 北邵洼 -> 南邵 -> 沙河高教区 -> 沙河 -> 巩华城 -> 朱辛庄 -> 生命科学园 -> 西二旗 -> 亦庄线: 宋家庄 -> 肖村 -> 小红门 -> 旧宫 -> 亦庄桥 -> 亦庄文化园 -> 万源街 -> 容京东街 -> 荣昌东街 -> 同济南路 -> 经海路 -> 次渠南 -> 次渠 -> 亦庄火车站 -> 房山线: 郭公庄 -> 大葆台 -> 稻田 -> 长阳 -> 篱笆房 -> 广阳城 -> 良乡大学城北 -> 良乡大学城 -> 良乡大学城西 -> 良乡南关 -> 苏庄 -> 阎村东 -> 机场线: 东直门 -> 三元桥 -> T2/T3航站楼 -> s1线: 石厂 -> 小园 -> 栗园庄 -> 上岸 -> 桥户营 -> 四道桥 -> 金安桥 -> 燕房线: 燕山 -> 房山城关 -> 饶乐府 -> 马各庄 -> 大石河东 -> 星城 -> 阎村 -> 紫草坞 -> 阎村东 -> 西郊线: 香山 -> 植物园 -> 万安 -> 茶棚 -> 颐和园西门 -> 巴沟 -> 新机场线: 草桥 -> 大兴新城 -> 大兴机场 ->
显示某一条线路的所有站点
-a", "2号线", "-map
功能2 2号线: 积水潭 -> 鼓楼大街 -> 安定门 -> 雍和宫 -> 东直门 -> 东四十条 -> 朝阳门 -> 建国门 -> 北京站 -> 崇文门 -> 前门 -> 和平门 -> 宣武门 -> 长椿街 -> 复兴门 -> 阜成门 -> 车公庄 -> 西直门 -> 积水潭 ->
-a", "6号线", "-map
功能2
6号线: 金安桥 -> 杨庄 -> 西黄村 -> 廖公庄 -> 田村 -> 海淀五路居 -> 慈寿寺 -> 花园桥 -> 白石桥南 -> 车公庄西 -> 车公庄 -> 平安里 -> 北海北 -> 南锣鼓巷 -> 东四 -> 朝阳门 -> 东大桥 -> 呼家楼 -> 金台路 -> 十里堡 -> 青年路 -> 褡裢坡 -> 黄渠 -> 常营 -> 草房 -> 物资学院路 -> 通州北关 -> 北运河西 -> 北运河东 -> 郝家府 -> 东夏园 -> 潞城 ->