北京地铁线路查询
北京地铁线路查询
一、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
- C++判断char*的指向
- Linux基础(day18)
- Spring Boot搭建Web应用
- 5.7 vim实践
- Effective Modern C++翻译(7)-条款6:当auto推导出意外的类型时,使用显式的类型初始化语义
- 2.3 ls命令
- Effective Modern C++翻译(6)-条款5:auto比显示的类型声明要更好
- 大白话-prototype属性
- Effective Modern C++翻译(5)-条款4:了解如何观察推导出的类型
- Effective Modern C++翻译(4)-条款3:了解decltype
- 大白话-constructor
- Effective Modern C++翻译(3)-条款2:明白auto类型推导
- React Native在Android平台运行gif的解决方法
- Effective Modern C++翻译(2)-条款1:明白模板类型推导
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【一天一大 lee】四数之和 (难度:中等) - Day20201005
- 【一天一大 lee】两数相加 (难度:中等) - Day20201004
- 历经14天自定义3个注解解决项目的3个Swagger难题
- 【一天一大 lee】秋叶收藏集 (难度:中等) - Day20201001
- 【译文】Facebook工程师谈运维工作的未来
- 【一天一大 lee】环形链表II (难度:中等) - Day20201010
- 【西法带你学算法】一次搞定前缀和
- 一文快速入门分库分表中间件 Sharding-JDBC (必修课)
- 求求你别再用System.out.println 了!!
- 为什么阿里巴巴Java开发手册中强制要求超大整数禁止使用Long类型返回?
- 独家 | 教你用Python来计算偏差-方差权衡
- 使用 KinD 加速 CI/CD 流水线
- 使用 Docker 加速开发工作流
- Kubernetes CRD 自定义控制器
- 推荐算法之: LFM 推荐算法