地铁查询系统的开发已经告一段落了,我想在这里总结一下关于开发地铁查询系统的总过程。
1、数据库部分
数据库中存在两张表,一张是站点表(line),属性包括站点编号(StopID),站点名称(StopName),站点所属线路(Line)。第二张表是线路交点表(changestop),属性包括第一条线路(ID1),第二条线路(ID2),站点名称(ChangeStopName)。
2、状况模拟
查询分为三种情况。第一种,在同一条线路上的站点,其中包括起始站或终点站都是转乘点的情况;第二种,分布在两条线上的起始站和终点站,且起始站和终点站所在的线路存在交点;第三种情况,起始站和终点站在不同的两条线路上,且两点之间不存在交点,即需要第三条线作为中转。
3、算法设计
第一种情况中,得到查询输入的起始站和终点站,查询line表,在二者的Line属性相同的情况下,得到二者StopID差值的绝对值即可得到站数,然后输出其中的StopName。
第二种情况中,得到查询输入的起始站和终点站,查询line表,得到二者的Line属性,然后查询changestop表,将得到的Line属性作为条件查询得到
ChangeStopName属性的值,然后再回到第一张表line中,以起始站Line属性和ChangeStopName属性定位与起始站线路相同的中转站,然后求出起始站到中转站的StopName,再以终点站Line属性和ChangeStopName属性定位与终点站线路相同的中转站,求出中转站到终点站的StopName,最后合并到同一个list中即可。
第三种情况中,得到查询输入的起始站和终点站,查询line表,得到二者的Line属性,然后查询changestop表,将得到的Line属性作为条件查询,得到的值应当为空。在这种情况下,我们应该再次查询changestop表,将得到的起始站Line属性作为第一条记录的ID1,将得到的终点站Line属性作为第二条记录的ID2,求满足第一条记录ID2等于第二条记录ID1的线路ID并记录1。然后依旧在本张表中,以起始站Line属性作为ID1,将ID作为ID2,查询ChangeStopName,得到第一个中转点;然后以ID作为ID1,将终点站的Line属性作为ID2,查询ChangeStopName,得到第二个中转点。然后在line表中,查询起始站到第一个中转站的中间站名;之后查询第一个中转站到第二个中转站的中间站名;最后查新第二个中转站到终点站的站名。最后将三部分放入同一个list中。
4、完成状态
按照以上规划,地铁查询系统基本完成,但依旧存在许多可以修改的地方,比如代码重复的问题在我写第三种情况的时候非常严重,有几十行代码几乎一模一样。再比如事实上我对数据库部分的设计并不满意,一开始我设计了7个表,6个存放各个站点,但由于多表查询过于复杂(事实上我上网查询相关内容时并没有2张表以上的联合查询,也几乎没有对多张无关联表的查询),所以我只好将所有的内容放入一张表中。总之,这次合作开发并不算成功,同样也暴露出我的许多问题。
5、代码实现
https://github.com/Evilleon/sjzsubway
注:1、可能这里我描述会有些不明白,是这样的,假设我已经查询出两条数据,第一条数据的ID1是起始站,第二条数据的ID2是终点站,然后第一条数据的ID2=第二条数据的ID1——我要找的就是这样的两条数据。
原文地址:https://www.cnblogs.com/YXSZ/p/10712560.html