1、数据存储方式
最初采用map存储(地铁线路,站定名称,转站线路)。
1 营口道 3
这样在查询某条线路的所有站点时,可以便于查询。
同时可以得知某个站点是否为转站的车站,以及转站的线路。
不过在完成最短路径查询的需求时,发现难以将一条先上的站点按顺序串联起来,难以完成最短路径的查询。
网上查询相关代码后,改变存储方式为(前一站,后一站,两站间距离)。
由于题目中没有给出两站的距离,因此两站的距离均设为1。
南孙庄 南何庄 1
这种数据的存储方式能够确保一条地铁线路的所有站点串连起来,方便之后进行最短路径查找。
2、需求1导入txt文件
InputStreamReader instream = new InputStreamReader(new FileInputStream(file)); BufferedReader reader = new BufferedReader(instream);
通过(line = reader.readLine()) != null判断循环条件将txt文本文件里的地铁线路信息读入
String nodeName1 = items[0]; String nodeName2 = items[1]; int length = Integer.valueOf(items[2]);
3、查询指定地铁线经过的站点
由于采用前一站,后一站,两站间距离的方式存储,输出一条线上的所有站点较为麻烦。
于是在读取数据时建立数组存储,在实现查询指定地铁线经过的站点的需求时,直接输出数组里的内容即可。
for(int i = 0;i<line[linename-1].length;i++) { oneLine[i]=line[linename-1][i]; }
虽然需要额外开设数据空间对地铁站点信息加以存储,不过在需求实现上非常方便。
输入:
-a 1
输出:
西站-->西北角-->西南角-->鼓楼-->东南角-->建国道-->天津站-->远洋国际中心-->顺驰桥-->靖江路-->翠阜新村-->屿东城-->登州路-->国山路
4、两站点间最短路径查找
如果两个站点在同一条地铁线上,则直接返回结果。
if (a.isConnected(b)) { rs.getPath().add(b); rs.setDis(data.getDis().get(a, b)); cache.put(key, rs); return rs; }
如果两个站点在两条不同的地铁线上。
以线路上是否还有下一个站点,作为循环条件。
while (nodes.hasNext())
如果一直有下一个站点,则循环进行递归调用。
输入函数的参数为(下一个站点,目的站,经过的站点路线)。
Node temp = nodes.next(); Integer dis = -1; Set<Node> visted_child = new HashSet<Node>(); visted_child.addAll(visited); Path child = getShortDis(temp, b, visted_child);
如果还不是相邻的两站,则直接进行下一次循环。
如果是最后两站,或者距离更加短,则存储进tempRs。
if (child.getDis() == -1) continue; dis = data.getDis().get(a, temp) + child.getDis(); if (tempRs == -1 || dis < tempRs) { tempRs = dis; path_temp = child.getPath(); }
输入:
-b 民权门 金狮桥
输出:
4 民权门 北宁公园 北站 中山路 金金狮桥
5、体会
构思地铁线路问题,将其抽象为基于图的运算。设计主要功能模块。
由于对最短路径查询算法不太熟练,程序编写还有部分问题,参考了相关的代码。