一、任务要求:实现一个能处理正确输入的命令行的计算地铁线路最短路径的程序
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.测试用例
2.GitHub地址:https://github.com/UnlightedOtaku/pairsubway/invitations
六、总结