地铁线路具体实现方法

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、体会

构思地铁线路问题,将其抽象为基于图的运算。设计主要功能模块。

由于对最短路径查询算法不太熟练,程序编写还有部分问题,参考了相关的代码。

猜你喜欢

转载自www.cnblogs.com/kuiersaila/p/11672884.html