线路1 站点1 站点2 ...... 站点n
1号线 苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨地 南礼士路 复兴门 西单 天安门西 天安门东 王府井 东单 建国门 永安里 国贸 大望路 四惠 四惠东
2号线 西直门 车公庄 阜成门 复兴门 长椿街 宣武门 和平门 前门 崇文门 北京站 建国门 朝阳门 东四十条 东直门 雍和宫 安定门 鼓楼大街 积水潭 西直门
public void calculate(Station s1, Station s2){
String line="初始线";
if(outList.size() == DataBuilder.totalStaion){
route.add("找到目标站点:"+s2.getName()+",共经过"+(s1.getAllPassedStations(s2).size()-1)+"站\n");
int flag=0;
for(Station station : s1.getAllPassedStations(s2)){
if(station.getLinename()==null){//出发站
route.add(station.getName()+"->");
}
else if(station.getName().equals(s2.getName())){//最后1站
if(!station.getLinename().equals(line)){
route.add("换乘"+station.getLinename()+"->"+"到达 "+station.getName());
}
else {
route.add("到达 " + station.getName());
}
}
else if(!station.getLinename().equals(line)&&flag==1){//换乘后1站
line=station.getLinename();
route.add("换乘"+station.getLinename()+"->"+station.getName()+"->");
}
else if(!station.getLinename().equals(line)&&flag==0){//第2站
line=station.getLinename();
route.add("乘坐"+station.getLinename()+"->"+station.getName()+"->");
flag=1;
}
else{//其余站
line=station.getLinename();
route.add(station.getName()+"->");
}
}
return;
}
if(!outList.contains(s1)){
outList.add(s1);
}
//如果起点站的OrderSetMap为空,则第一次用起点站的前后站点初始化之
if(s1.getOrderSetMap().isEmpty()){
List<Station> Linkedstations = getAllLinkedStations(s1);
for(Station s : Linkedstations){
s1.getAllPassedStations(s).add(s);
}
}
Station parent = getShortestPath(s1);//获取距离起点站s1最近的一个站(有多个的话,随意取一个)
if(parent == s2){
System.out.println("找到目标站点:"+s2+",共经过"+(s1.getAllPassedStations(s2).size()-1)+"站");
for(Station station : s1.getAllPassedStations(s2)){
System.out.print(station.getName()+"->");
}
return;
}
for(Station child : getAllLinkedStations(parent)){
if(outList.contains(child)){
continue;
}
int shortestPath = (s1.getAllPassedStations(parent).size()-1) + 1;//前面这个1表示计算路径需要去除自身站点,后面这个1表示增加了1站距离
if(s1.getAllPassedStations(child).contains(child)){
//如果s1已经计算过到此child的经过距离,那么比较出最小的距离
if((s1.getAllPassedStations(child).size()-1) > shortestPath){
//重置S1到周围各站的最小路径
s1.getAllPassedStations(child).clear();
s1.getAllPassedStations(child).addAll(s1.getAllPassedStations(parent));
s1.getAllPassedStations(child).add(child);
}
} else {
//如果s1还没有计算过到此child的经过距离
s1.getAllPassedStations(child).addAll(s1.getAllPassedStations(parent));
s1.getAllPassedStations(child).add(child);
}
}
outList.add(parent);
calculate(s1,s2);//重复计算,往外面站点扩展
}
? 参考了网上源码后,把源码进行理解分析,然后进行大面积的修改分析,地铁信息改为从txt读入,并加入了很多的map,list结构,加了乘坐什么线路换乘什么线路信息,自己编写了ui,控制了不正确的输入,同时只要txt格式正确,该系统可以适用于任何城市公交地铁线路
参考源码: [https://blog.csdn.net/wangchsh2008/article/details/46288967][GFM].
Github链接: [https://github.com/xiao-bailong/BeiJingSubwayRouteProgram][GFM].
原文:https://www.cnblogs.com/31701057yu/p/11675070.html