github代码:https://github.com/udontno/subway
注:由于网上搜到的迪杰斯特拉算法我有点不太理解同时没有很好掌握java的各种集合类型导致我在做的时候有点无从下手,所以没能独立完成。
所做的工作:
1.写入subway.txt,每一条线路的站点,同时使每个地铁站的名字先用字母作为代码存储,然后再在输出时转化为原来的名字
2.进行相应的代码调整,新增 getLinename 和 getLinecode 代码,在后续进行读取和输出的时候可以更方便的对输出线路的名字和代码进行转换
3.进行输入控制,有起始站和终点站相同以及参数输入错误的错误提示
一.类的分析
我共使用了5个类
①Calculatioin类:该类主要进行对数据的计算,根据题意,需要求最短路径,所以我采用的是Dijkstra算法,我查阅相关资料得知,Dijkstra算法重要的有三个步骤
1.首先找所有相邻点,在这个函数中,遍历所有的路线,生成一个邻居节点的列表
public static ListgetNeighbor(Station station){}
2.然后计算最小权值,找出下一个要分析的节点,每次循环遍历距离最小的未被遍历过的节点
private static Station getNextStation()
3.最后利用已知条件调用迪杰斯特拉算法进行求解
public static ResultRoute calculate(Station startsta, Station endsta)
②ResultRoute类:该类用于进行对结果路线的操作,有如下几个域,同时对应的设置了get和set方法
private Station startsta;// 所求路线起始站
private Station endsta;// 所求路线终点站
private int step = 0;// 设置初始步长为0,然后每次加一个步长(由于题意不考虑距离,则以步数计算路程)
private List
③Rwfile类:该类用于进行文件的写入读出操作以及配合Dijkstra算法执行的相应函数
public static void readTXT(){}// 从文本文件中读取输入
public static String getLinename(String s) {}// 遍历subwayCode,找到与线路代码相对应的线路名
public static String getLinecode(String s) {}// 遍历subwayCode,找到与线路相对应的代码
public static ArrayListgetStaline(String lineStr, String linename){}// 用线路名得到路线的站点
public static String writeLine(String linename){}// 将结果逐行写入文件
④Station类:该类主要实现对站点的操作,有如下几个域,同时对应的设置了get和set方法
private String staname;// 站点名称
private String staline;// 站点所在线路
private Listneighbor = new ArrayList<>();// 站点的邻居节点
⑤subway类:该类主要实现对命令行输入的判断并跳转到相应操作
if (args[0].equals("-map"))
else if (args[0].equals("-a"))
else if (args[0].equals("-b"))
else
二.文本文档格式
subway.txt的格式如下:
……此处省略部分路线……
三.实际测试
①单独运行
②读取线路
③同一线路上的两个站点
④需要转线
⑤起始站与终点站为同一站报错
⑥参数输入错误报错
四.总结
这次个人项目让我发现我需要学习的地方还有很多,就像迪杰斯特拉算法我还不是很熟悉,我将会在之后的学习中更加努力,查漏补缺,每天进步一点点。