一,需求分析
1.任务:
实现一个帮助进行天津地铁出行路线规划的命令行程序。
主要功能包括:
a.输入 java subway -map subway.txt 要能让程序读入准备的源数据。
b.输入java subway -a 1号线 -map subway.txt -o station.txt要能查出该条地铁线包含的站并保存在station.txt中。
c.输入subway.exe -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.测试功能要求1 2. 3.源码下载Github下载地址:https://github.com/Bettetman/ShortDis.git 五.总结 1.爬坑过程中,多次用到像list1=list2的语句赋值,但是测试发现达不到想要的效果,即在编程的过程中,我们很容易把对象的引用指向宁外一个对象,但是这个过程和基础数据有很大的不同,原因是,list1=list2二者指向的是内存的同一对象,因此不管是list1还是list2操作都会改变 原来内存中的对象. 2.项目的不足:时间精力有限,算法的实现有点粗糙,并且用BFS实现的算法复杂度较高,而BFS本身带的算法会存在一个不足,那就是当 A站->B站 所有的路径只会存在一条,而同时存在多条路径时,这个问题难免不应该让我们忽略.