经过几天的痛苦摸索以及调试,终于能够有这么一个 demo 。
其中遇到的问题最主要的有一个,就是怎么将 txt 文件中的数据读取到 rms数据库中,就是在这个demo版本中,也没有很好的解决,可能是因为我添加资源文件的时候没有操作正确。我在用jbuilder9将所有文件打包的时候强制将我的txt文件加入进去,生成的jar和jad运行的时候终于可以正确找到txt。这个问题在后面的版本中将得到修正。
以下是一些自己的想法和网上搜集到的别人的想法:
===========
可以将公交路线按照某种格式放到一个 txt 文件中,然后我在程序中写一个专门的方法,将该城市的公交路线读取存放到rms数据库中 ,至于rms数据库是我的这些数据怎么组织设计的现在头脑里还是比较模糊。
这样一来可以提供给我查询的数据就有了,那么可以有以下几种查询 :
1、根据线路查询 :比如查询 1路,结果为 1路 由开始站到结束站
2、根据站名查询:看那些路线经过该站,同时列出该路线的所有站点
3、根据自己的出发站点和自己的目的站点查询: (1)如果有直达路线,那么列举出这些路线,同时显示这些路线的站点,出发站点和结束站点 之间用颜色标记。(2)如果没有直达路线,给出一次换乘方案,列举出这些换乘方案 ,同时颜色标记注意:换乘的时候考虑经过的路线较短就可以了。列出所有的可能方案然后按照线路长短排序。
另外其他可能要考虑的就是路线是否是单向?等等,,先不考虑。
只找简单通路
算法:
1、找出所有从“起点”出发的线路,设为RecordsetFrom;
2、找出所有到达“终点”的线路,设为RecordsetTo;
3、首先找“直达”,如果一条线路即出现在RecordsetFrom,又出现在RecordsetTo,则该条线路为“直达”,即中转为0次。
4、再找中转1次的。首先将直达线路从RecordsetFrom和RecordsetTo中移除。遍历RecordsetFrom中的每一条线路,设为“线路A”,再遍历这条线路中除“起点”外的每一个站名,设为“中转站”。找出所有从“中转站”出发的线路,设为RecordsetMid。如果一条线路即出现在RecordMid,又出现在RecordsetTo,则该条线路为“线路B”,即:起点-〉线路A-〉中转站-〉线路B-〉终点。
5、中转多次的算法就是上述算法的循环套接,描述起来比较复杂,而且就公交出行来说中转2次以上的线路实用性不大。
算法2
1.编写函数
函数 a(起点,终点)
输出参数:线路名
代码:查找所有线路,找出包含终点和起点名的线路。
2.查找直达:调用函数a(起点,终点)
3.转一次车:调用函数a(起点,起点),取出返回的线路中所有站点,循环调用函数a(站点,终点)。
4.转两次车:调用函数a(终点,终点),取出返回的线路中所有站点,同步骤3中的所有站点做两重循环调用函数a(站点,站点).
实际应用中线路一般在几百条,不会很多。函数a也不必查找所有线路,上面的每个步骤都不用查找上面步骤中找过的线路。
算法3:
1.从起点站s开始,记转车次数=0,
2.查询含有s的所有车次n,
3.对于车次n,查找s站能到达的所有站点s1,
4.逐个排查s1中是否有终点站e:
a.如果有,即找到了路径,记录在path数组中,跳到output;
b.如果没有,则记录下已经查找过的车次数组f,下次无需再排查此车次,到下一步查找1次中转;
5.从中转站s1开始,记转车次数=1,
6.查询含有s1的所有车次n,
7.对于车次n,查找s站能到达的所有站点s2(无需查找f),
8.逐个排查s2中是否有终点站e:
a.如果有,即找到了路径,记录在path数组中,跳到***
b.如果没有,则记录下已经查找过的车次数组f,下次无需再排查此车次,到下一步查找1次中转;
9.从中转站s2开始,记转车次数=2,
10.查询含有s2的所有车次n,
11.对于车次n,查找s站能到达的所有站点s3(无需查找f),
12.逐个排查s3中是否有终点站e:
a.如果有,即找到了路径,记录在path数组中,跳到***
b.如果没有,则记录下已经查找过的车次数组f,下次无需再排查此车次,到下一步查找1次中转;
13.从中转站s3开始,记转车次数=3,
14.查询含有s3的所有车次n,
15.对于车次n,查找s站能到达的所有站点s4(无需查找f),
16.逐个排查s4中是否有终点站e:
a.如果有,即找到了路径,记录在path数组中,跳到***
b.如果没有,则记录下已经查找过的车次数组f,下次无需再排查此车次,到下一步查找1次中转;
……如此循环下去,当然,可以把每4项编成一个过程,然后递归调用,我为了说明得更清楚,所以没有用递归,而是每一步骤都给出,便于大家理解。
呵,你说的不就是我说的思路么,只是你的算法需要补充和修正:
修正:在理解上,站点和车次的关系问题:站点不属于任何车次,车次只是站点的一个属性,所以只需要知道站点连接的站点,把车次作为两个站点连接的属性就可以,这样你就撇开了车次的困扰。还有,排除否环行和回行的方法非常简单:只要判断是否回到某个以往站点就可以,(注意:包括回到任何其他路线的以往站点,具体原因请自己考虑)这样就节省了大量数组。
最后,由于排除了回行和环行的情况,我大致估算了一下,计算量已经非常少了,如果可能的话,用文本文件就可以实现了。
==========
目前demo版本做到的只是将txt放到了rms中,能够根据路线和站名查询,同时也支持查询所有的路线,不提供从起点到终点的查询。将在后面的版本中实现。