地铁出行线路规划
github: 31701022
问题回顾
实现一个能正确处理命令行的计算地铁最短路径的程序
首先根据需求设计可读入文件
第一行是线路,从第二行开始每一行表示对应线路的站点,线路之间和站点与站点之间用、分隔
1号线、2号线、4号线、5号线...
苹果园、古城、八角游乐园、八宝山...
西直门、积水潭、鼓楼大街、安定门...
安河桥北、北宫门、西苑、圆明园、北京大学东门...
宋家庄、刘家窑、蒲黄榆、天坛东门、磁器口...
......
......
创建一个station类用于存储站点对象,存储站点名和对应的线路和相邻站点,省略get/set方法
public class station {
private String name;
public station prev;
public station next;
private Map<station,LinkedHashSet<station>> orderSetMap = new HashMap<station,LinkedHashSet<station>>();
private String line;
public station (String name){
this.name = name;
}
采用getAllPassedStations方法得到从起点站到终点站的所有路径集合
public LinkedHashSet<station> getAllPassedStations(station station) {
if(orderSetMap.get(station) == null){
LinkedHashSet<station> set = new LinkedHashSet<station>();
set.add(this);
orderSetMap.put(station, set);
}
return orderSetMap.get(station);
}
然后读取文件,每一条线路对应一个station数组
private static List<station> line1 = new ArrayList<station>();//1号线
private static List<station> line2 = new ArrayList<station>();//2号线
...
数据读取完毕后计算最短路径采用Dijkstra算法,每次计算完一个最近的站点,然后再分析下一个最近的站点,直到结束。
核心算法
private station getShortestPath(station station){ //station站到各个站的最短距离,每相邻两个站距离为1
int minPatn = Integer.MAX_VALUE;
station rets = null;
for(station s :station.getOrderSetMap().keySet()){
if(outList.contains(s)){
continue;
}
LinkedHashSet<station> set = station.getAllPassedStations(s);//参数station到s站所经过的所有站点的集合
if(set.size() < minPatn){
minPatn = set.size();
rets = s;
}
}
return rets;
}
计算出最短路径后输出结果采用字符串数组存储站点和线路信息后输出
public List <String > linename= new ArrayList<>();//存储输出结果
命令行需求采用-map参数读取对应可读入文件
Java subway -map subway.txt
Java subway -map subway.txt args[arg].equals("-map")
采用-a指定对应线路地铁站 并采用-o输出
subway -a 2号线 -map subway.txt -o station.txt
Java subway -map subway.txt args[i].equals("-a") args[w].equals("-o") args[i+1].equals("1号线") ...
采用-b输入起点和终点并采用-o输出
subway -b 安定门 万寿路 -map subway.txt -o routine.txt
Java subway -map subway.txt args[i].equals("-b")
小结:
本次实验采用了LinkedHashSet集合,LinkedHashSet是一个哈希表和链表的结合,且是一个双向链表,元素不重复且有序,因此用来寻找站点站点非常方便,同时采用了Dijkstra算法可扬较方便找到最短路径。
当然实验过程遇到了一些问题:
首先在I/O的读取和写入上就遇见了问题,用BufferedWriter写入却没有内容,BufferedWriter通过字符数组来缓冲数据,当缓冲区满或者用户调用flush()函数时,它就会将缓冲区的数据写入到输出流中。然后是算法上忘的有点多,最后在采用命令行是遇到了两个问题
javac 找不到符号 错误 因为写了三个文件互相调用所以单独编译一个文件是无法编译成功,原因是因为环境变量没有配置好,将所有类同时编译即可。
java.lang.NoClassDefFoundError运行时不可以加载到类
由于有package存在所以没有办法之间调用类里的main函数,所以我采用package.main的方式成功运行main函数
通过这个实验感觉还是有不少提高的,也踩了不少雷,希望下次能长点记性。