一、任务要求:实现一个能处理正确输入的命令行的计算地铁线路最短路径的程序
1.读取 -map 参数来获得对应的自定义地铁文件(命名为 subway.txt)。
java subway -map subway.txt
2.用户希望查询指定地铁线经过的站点。这样,在应用程序需要支持一个新的命令行参数 -a
,它指定了用户希望查询的地铁线路。
java subway -a 1号线 -map subway.txt -o station.txt
3.能查出两站的最短路径,并保存在 routine.txt中(路径中要包含换乘信息)
java subway -b 洪湖里 复兴路 -map subway.txt -o routine.txt
二、psp
PSP 2.1 | Personal Software Process Stages | Time |
---|---|---|
Planning | 计划 | |
· Estimate | · 估计这个任务需要多少时间 | 14day |
Development | 开发 | |
· Analysis | · 需求分析 (包括学习新技术) | 2day |
· Design Spec | · 生成设计文档 | 1day |
· Design Review | · 设计复审 (和同事审核设计文档) | 1day |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 0.5day |
· Design | · 具体设计 | 2day |
· Coding | · 具体编码 | 2day |
· Code Review | · 代码复审 | 1day |
· Test | · 测试(自我测试,修改代码,提交修改) | 0.5day |
Reporting | 报告 | |
· Test Report | · 测试报告 | 0.5day |
· Size Measurement | · 计算工作量 | 0.5day |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 0.5day |
合计 | 11.5day |
三、计算模块接口的设计与实现过程
1.subway.txt。如下图,每一条地铁线占一行,方便读取;线名号后加冒号,方便进行线名和站名分开;#是可换乘站,如西站#6可以换乘6号线,方便后续换乘处理,否则还要在所有线路中查找是否有该站。
2.代码分析
Station.java
//站点的类,包括站点名称、所在线路、是否换乘、可换乘的线路以及其相邻站点。 public String name; public String line; public Boolean isTransferStation; public List<String> lines = new ArrayList<>(); public List<Station> adjacentStation = new ArrayList<>();
SubwayLine.java
//地铁线路的类,包括线路名称以及该线路上的所有站点。 public String name; public List<Station> stations = new ArrayList<>();
subway.java
有两个全局变量lines和stations,分别存储全部路线和全部站点;subwayMap()方法读取地图信息、getLineName()获取站点所在线路、main()读取命令行不同参数实现不同功能,如args[0]=-map就读取地图信息、如args[0]=-a实现查询线路的功能、如args[0]=-b实现查询最短路径的功能。
dijkstra.java
该类实现求最短路径结果,用到了迪杰斯特拉算法。
Result.java
//结果的类,包括起点站、终点站、两站点之间的最短距离以及该线路上所经过的站点。 private Station startStation; private Station endStation; private int distance; private List<Station> passStations = new ArrayList<>(); public Station getStartStation() { return startStation; } public void setStartStation(Station startStation) { this.startStation = startStation; } public Station getEndStation() { return endStation; } public void setEndStation(Station endStation) { this.endStation = endStation; } public int getDistance() { return distance; } public void setDistance(int distance) { this.distance = distance; } public List<Station> getPassStations() { return passStations; } public void setPassStations(List<Station> passStations) { this.passStations = passStations; }
3.未实现功能
命令行下通过指令运行报错,IDEA下通过设置参数可以正常运行。
四、测试结果
1.读取线路地图信息。下图为参数设置和控制台输出信息。
2.查询线路。下图分别为参数设置和控制台输出以及station文件内容。
3.实现查询最短路径。下图为参数设置和控制台运行结果以及routine文件。
五、作业测试用例和GitHub地址
1.测试用例
-a 1号线 -map subway.txt -o station.txt
-a 2号线 -map subway.txt -o station.txt
-a 3号线 -map subway.txt -o station.txt
-a 9号线 -map subway.txt -o station.txt
-a 5号线 -map subway.txt -o station.txt
-a 6号线 -map subway.txt -o station.txt
-b 洪湖里 复兴路 -map subway.txt -o routine.txt
-b 刘园 复兴路 -map subway.txt -o routine.txt
-b 曹庄 复兴路 -map subway.txt -o routine.txt
-b 小淀 复兴路 -map subway.txt -o routine.txt
-b 洪湖里 大毕庄 -map subway.txt -o routine.txt
-b 月牙河 复兴路 -map subway.txt -o routine.txt
-b 刘圆 月牙河 -map subway.txt -o routine.txt
-b 天津站 洪湖里 -map subway.txt -o routine.txt
-b 辽河北道 复兴路 -map subway.txt -o routine.txt
-b 北宁公园 复兴路 -map subway.txt -o routine.txt
2.GitHub地址: https://github.com/UnlightedOtaku/pairsubway
六、总结
项目代码已经提交到github系统中,在这次结对编程中, 我的结对对象是张华辉同学,他的博客园链接 https://www.cnblogs.com/zhhzsc/ 。本次项目让我回顾了java相关知识,数据结构与算法的内容,熟悉了idea开发java,了解了结对编程及其相关优势。
在开发过程中也遇到了一些困难,比如如何用命令行指定参数,如何存储地图信息,dijsktra算法具体如何实现,文件读取的异常处理等等。
总而言之,这次项目让我回顾了相关知识,进行了具体实践,磨合了与搭档的关系。