北京地铁出行线路规划——个人项目

我怕爱的太早我们不能终老 提交于 2019-12-01 09:27:53

项目地址

详见:

一、基本功能

  • 获取地铁线路图。

以参数 -map 作为标志,来获得对应的自定义地铁线路图信息文件(命名为 Subway.txt)。输入格式如:

java Subway -map Subway.txt
  • 获取指定地铁线路。

以参数 -a 作为标志,并输入指定地铁线路,输出的文件以参数 -o 来指定。从线路的起始站点开始,依次输出该地铁线经过的所有站点,直到终点站。输入格式如:

subway.exe -a 1号线 -map Subway.txt -o Station.txt
  • 输入起始站点与目的站点,输出相应最短路线。

以 -b 参数作为标志,并输入起始站点与目的站点,输出经过的站点的个数和路径(包括起始站点与目的站点),如果需要换乘,则在换乘站的下一行输出换乘的地铁线路。将结果写入 routine.txt 中。输入格式如:

java Subway -b 苹果园 雍和宫 -map Subway.txt -o Routine.txt

二、文件存储

地铁线路图信息等都以txt的文件格式存储,以方便程序读取,简洁易懂,并可以灵活拓展。

  • 地铁线路图信息——Subway.txt
1号线 苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨路 南礼士路 复兴门 西单 天安门西 天安门东 王府井 东单 建国门 永安里 国贸 大望路 四惠 四惠东 2号线 西直门 积水潭 鼓楼大街 安定门 雍和宫 东直门 东四十条 朝阳门 建国门 北京站 崇文门 前门 和平门 宣武门 长椿街 复兴门 阜成门 车公庄  ……
  • 地铁线所经站点——Station.txt
1号线 苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨路 南礼士路 复兴门 西单 天安门西 天安门东 王府井 东单 建国门 永安里 国贸 大望路 四惠 四惠东
  • 起始站点与目的地间的最短路线——Routine.txt
需乘坐17个站点。 1号线: 苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 (同站换乘)9号线: 白堆子 白石桥南 国家图书馆 (同站换乘)4号线大兴线: 动物园 西直门 (同站换乘)2号线: 积水潭 鼓楼大街 安定门 雍和宫

三、代码分析

  • Subway.java
//      java Subway -map Subway.txt         if(args.length==2) {             new FileOperate(args[0], args[1]);         } //      java Subway -a 1号线 -map Subway.txt -o Station.txt         else if(args.length==6){             new FileOperate(args[0],args[1],args[2],args[3],args[4],args[5]);         } //      java Subway -b 苹果园 雍和宫 -map Subway.txt -o Routine.txt         else if(args.length==7){             new FileOperate(args[0],args[1],args[2],args[3],args[4],args[5],args[6]);         }         else{             System.out.println("ERROR!");
  • Station.java
    private String stationName;     private String lineName;     private List<Station> allLinkStations=new ArrayList<>();//所有相邻站点     public static LinkedHashSet<List<Station>> allLines=new LinkedHashSet<>();//所有地铁线路
  • Routine.java
    private Station startStation;     private Station endStation;     private List<Station> allPassStations=new ArrayList<>();     private int distance=0;
  • FileOperate.java

对文件做读写操作

 
  • Dijkstra.java

Dijkstra算法,参考链接:https://juejin.im/entry/589049ea0ce4630056dc74d6

//    计算最短路径(相邻站点距离默认都为1)      public static Routine getShortestPath(Station start, Station end) {           //添加起始站点          if (!outList.contains(start)) {              outList.add(start);          }                    //第一次用起始站点的相邻站点初始化          if (path.isEmpty()) {              List<Station> allLinkStations = Station.getAllLinkStations(start);              for (Station station : allLinkStations) {                  Routine routine = new Routine();                  routine.setStartStation(start);                  routine.setEndStation(station);                  int distance = 1;//起始站点距离初始为1                                     routine.setDistance(distance);                  routine.getAllPassStations().add(station);//起始站点已经分析过                  path.put(station, routine);             }         }            //      获取下一站点         Station nextStation = getNextStation();         if (nextStation.equals(end)) {             return path.get(nextStation);         }                    List<Station> nextLinkStations = Station.getAllLinkStations(nextStation);         for (Station station : nextLinkStations) {                 // 已经分析过的station,不再做任何经分析             if (outList.contains(station)) {                 continue;             }             //每增加一个站点,距离+1             int distance = 1+path.get(nextStation).getDistance();              List<Station> allPassStations = path.get(nextStation).getAllPassStations();             Routine routine = path.get(station);             if (routine != null) {                 //已经计算过到此station的距离比较出最小的距离                 if (routine.getDistance() > distance) {                     routine.setDistance(distance);                     //重置start到周围各站的最小路径                     routine.getAllPassStations().clear();                     routine.getAllPassStations().addAll(allPassStations);                     routine.getAllPassStations().add(station);                 }             }              //如果start还没有计算过到此station的距离             else {                 routine = new Routine();                 routine.setDistance(distance);                 routine.setStartStation(start);                 routine.setEndStation(station); //              如果还没有计算过到此station的距离                 routine.getAllPassStations().addAll(allPassStations);                 routine.getAllPassStations().add(station);             }             path.put(station, routine);         }         outList.add(nextStation);         getShortestPath(start, end);//重复计算,往外面站点扩展         return path.get(end);     }

四、测试分析

  • 1、获取地铁线路图。
java Subway -map Subway.txt  1号线 苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨路 南礼士路 复兴门 西单 天安门西 天安门东 王府井 东单 建国门 永安里 国贸 大望路 四惠 四惠东 2号线 西直门 积水潭 鼓楼大街 安定门 雍和宫 东直门 东四十条 朝阳门 建国门 北京站 崇文门 前门 和平门 宣武门 长椿街 复兴门 阜成门 车公庄  ……

当格式错误:

java Subway -ma Subwa.txt  查询地铁线路图,请按照格式输入如:java Subway -map Subway.txt

在以下两种输入中,都做了对此情况的相应的输出。

当文件不存在时:

java Subway -map Subwa.txt  Subwa.txt文件不存在!

在以下两种输入中,都做了对此情况的相应的输出。

  • 2、获取指定地铁线路。
subway.exe -a 1号线 -map Subway.txt -o Station.txt  1号线 苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨路 南礼士路 复兴门 西单 天安门西 天安门东 王府井 东单 建国门 永安里 国贸 大望路 四惠 四惠东

当指定线路不存在时:

subway.exe -a 20号线 -map Subway.txt -o Station.txt  不存在此线路!
  • 3、获取起始站点到目的站点最短线路。
java Subway -b 苹果园 雍和宫 -map Subway.txt -o Routine.txt  需乘坐17个站点。 1号线: 苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 (同站换乘)9号线: 白堆子 白石桥南 国家图书馆 (同站换乘)4号线大兴线: 动物园 西直门 (同站换乘)2号线: 积水潭 鼓楼大街 安定门 雍和宫

当起始站点与目的站点一样时:

java Subway -b 苹果园 苹果园 -map Subway.txt -o Routine.txt  起始站点与目的站点相同,请重新输入!

当起始站点不存在:

java Subway -b 西湖 苹果园 -map Subway.txt -o Routine.txt  起始站点不存在!

当目的站点不存在:

java Subway -b 苹果园 西湖 -map Subway.txt -o Routine.txt  目的站点不存在!

五、个人小结

在完成个人项目的过程中,尽管与计划有所偏差,但还是很有收获的。从本次实验中,我觉得理清思路很重要,整个工程需要一个清晰的结构。不论是每一个java文件之间的结构,还是每一个函数之间的结构,还是数据存储的结构都十分重要,方便调用,也方便测试和修改。

地铁出行线路规划还是很贴近我们的生活的,我们只是用一个较为简单的方式,将线路查询功能模拟了出来。但我所做的这个项目还有不够完善的地方,主要是因为我没有合理分配好时间,只完成了基本功能,之后希望能做好结构和功能界面等方面的完善。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!