一、任务:
实现一个能处理正确输入的命令行的计算地铁线路最短路径的程序。
任务需求:
1.对于地铁线路信息图,我们约定它采用参数 -map 作为标志。程序启动时需要通过读取 -map 参数来获得对应的自定义地铁文件(命名为 subway.txt),从而得到地铁线路图的信息。
`java subway -map subway.txt`
2.用户希望查询指定地铁线经过的站点。这样,在应用程序需要支持一个新的命令行参数 -a
,它指定了用户希望查询的地铁线路。
`java subway -a 1号线 -map subway.txt -o station.txt`
3.用户希望坐地铁,他希望能通过最少的站数从出发点到达目的地,在命令行中以 -b 参数加两个地铁站点名称分别作为出发与目的。
`subway.exe -b 洪湖里 复兴路 -map subway.txt -o routine.txt`
二、PSP
PSP 2.1 | Personal Software Process Stages | Time |
---|---|---|
Planning | 计划 | |
· Estimate | · 估计这个任务需要多少时间 | 3weeks |
Development | 开发 | |
· Analysis | · 需求分析 (包括学习新技术) | 1day |
· Design Spec | · 生成设计文档 | 2days |
· Design Review | · 设计复审 (和同事审核设计文档) | 1day |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 1day |
· Design | · 具体设计 | 2days |
· Coding | · 具体编码 | 3days |
· Code Review | · 代码复审 | 2days |
· Test | · 测试(自我测试,修改代码,提交修改) | 1day |
Reporting | 报告 | |
· Test Report | · 测试报告 | 1day |
· Size Measurement | · 计算工作量 | 1day |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 2days |
合计 | 17days |
三、模块接口的设计与实现过程
1、源数据:
第一个数据6,表示一共有6条线路。紧着这一个空行,然后是1号线,共23个站,接着以刘园为起点站,距离下一个站的距离的为1,以此类推,直到终点站,距离下一个站标为-1,其他线路以此类推。
2、代码思想与设计
思想:将各个地铁路线的站台看为结点,通过边相连接,建立有向图,最后使用迪杰斯特拉算法算出站台之间的最短路径即可。
设计:
总共2个类:分别为Station类表示站台,Edge类表示站台与站台之间的边。
Station{
String stationame; // 站台名
boolean visited; // 用于迪杰斯特拉算法,判断是否标记
int dist; // 用于迪杰斯特拉算法,表示已知的从起点到达它的最短路径长度
Station path; // 记录迪杰斯特拉算法中,它前面路线的站台
String trackname; // 所处的地铁线
}
Edge{
Station station; // 通过这条边引出的节点(站台)
String lineName; // 所处线路名
int distance; // 这条边的权重(俩站台间的距离)
}
总共5个函数(除开主函数):
第一个函数为fileReader(),用于读取文本文件,通过二维数组存储每条地铁线路的所有站台,以及当前站台前后俩站台的边。
第二个函数为ShowStation(),根据用户所给的地铁线,输出对应的该条线路的所有的站台。
第三个函数为dijksraTravel(),参数为用户输入的起点,通过起点计算它到各个站点的最短距离。
第四、五个函数(参数不一样)为shortestPath(),通过递归的方式,从起点开始,逐个记录所经过的线路,最终到达终点,存储俩站台之间的最短路径。
未能实现部分:
由于技术有限,未能通过命令行启动程序,并读取不同的命令对应的命令行参数。
这里我采用的是通过编译器里根据指定的指示,让用户输入,并返回且存储响应结果于对应文件中。
如图:
四、测试效果
1.读取subway.txt文件,转换为对应的图。
此函数,用于读入数据。
2.通过-a,指定用户希望查询的地铁线路。
且存储在station文件中:
3.通过-b参数加上两个地铁站点名称,求俩站点之间的最短路线:
并存储结果至routine.txt文件中。
五、收获
通过本次结对编程,感受到了事半功倍的工作效果。同时通过本次项目,熟悉了java语言,以及通过idea进行编程的熟练程度。理解了最短路径算法的思想。
一开始,如果设计地铁线路就是一个难点,既要好读取,又能准备表达其中含义。以及以何种方式来保存这个地铁线路。最后通过的是二维数组进行保存每条线路。然后通过Map以站台为key,以它所引出的俩条边存储在ArrayList,该ArrayList作为values。
六、作业提交
github地址:https://github.com/Shanks07/homework