一,需求分析
1.任务:
实现一个帮助进行天津地铁出行路线规划的命令行程序。
主要功能包括:
a.输入 java subway -map subway.txt 要能让程序读入准备的源数据。
b.输入java subway -a 1号线 -map subway.txt -o station.txt要能查出该条地铁线包含的站并保存在station.txt中。
c.输入java subway -b 洪湖里 复兴路 -map subway.txt -o routine.txt要能查出两站的最短路径,并保存在 routine.txt中(路径中要包含换乘信息)。
2.PSP
二,软件的设计及算法思想实现
1.源数据结构说明
说明:以*.txt文件存储源数据,每一行代表的是一条线上所有站的信息,其中每一个站用空格隔开,而每一行的第一个数据代表的是该条地铁线的地铁名。
这样存储的好处是可以一次性读完所有的数据,而因为所求地铁不带权,因此只需要读到信息即可!
2.实体类属性说明
博主自定义了2个实体类(Station与Line)
Station包含的信息如下:
String name:主要存储的是地铁的名字。
boolean visited:用于BFS算法中需要用到的标记,代表是否访问。
String preStation:BFS回退求路径需要的一个备忘录。
String line:初始为空,当BFS算法求出一条最短路径后,需要计算此条路径下的某个站属于的地铁线。
List<String> lineNow = new ArrayList<String>():地铁站初始属于的地铁线,可能只有一个,也可能多个,
List<Station> nextStation = new ArrayList<Station>():相邻地铁的信息,即下一次能到达的所有地铁。当某线的开始站和结束站存储为1,其他的为2*n.
Line包含的信息如下:
int id:地铁的标记,不重要
String name:地铁的名字
List<String> stations = new ArrayList<>():某条地铁存储的所有站
3.关键类(Solve)实现及算法思想:
public void getSubwayMessage():负责读入*.txt的源数据
public void getStationByLine(String linename):传入参数是一个地铁线名,获得整个地铁线的地铁站
private void BFS(String st, String ed):传入参数 开始的地铁站,结束的地铁站 BFS参考的是 严蔚敏版<<数据结构>> 170页的BFS算法
public List calPassStations(String st, String ed):传入参数 开始的地铁站,结束的地铁站 这个是在BFS后的改进,在加入备忘录后,通过最后一个站回退到初始站,因此能找出这个最短路径,用列表List返回。
public void getChangeInfo(List<String> list):传入参数 最短路径的列表 加入最短路径的中所有Station,计算出当前Station的所属线,即Station.line
public void output(List<String> list)传入参数 最短路径的列表 这时候所有的站都被我们计算过所属站,功能主要是计算换乘信息存入routine.txt
4.项目目录展示
三.测试效果与运行
1.功能测试
a.读入信息测试:
输出lines的
输出所有站的节点:(一共141个站台信息初始进入map)
b.获得某个地铁线的信息
打开存储文档:
c.获得某条路线的信息并存储
四.打包,作业测试及提交
1.测试功能要求
打包说明:最开始我们用mvn compile编译打包,但是直接用Java subway运行报找不到主类错误,后来我们用javac */subway.java运行出现了其他的一些错误,最后发现是我们的几个相关类依赖出了问题,
还有就是编码的问题,但是我们都一一解决了,这是编译好的项目包 cn里面存放的是编译后的*.class文件
测试需求1与2(读入数据和查某条车站信息):
测试需求3(任意2个站的换乘信息):
2.源码上传到GitHub的地址:https://github.com/Bettetman/ShortDis.git
五.总结
1.爬坑过程中,多次用到像list1=list2的语句赋值,但是测试发现达不到想要的效果,即在编程的过程中,我们很容易把对象的引用指向宁外一个对象,但是这个过程和基础数据有很大的不同,原因是,list1=list2二者指向的是内存的同一对象,
因此不管是list1还是list2操作都会改变原来内存的对象。
2.项目的不足:时间精力有限,算法的实现有点粗糙,并且用BFS实现的算法复杂度较高,而BFS本身带的算法会存在一个不足,那就是当 A站->B站 所有的路径只会存在一条,而同时存在多条路径时,这个问题难免不应该让我们忽略.