北京地铁线路出行和规划

github       https://github.com/wangwenbo31701081/subway

需求概要

1.需要存储地铁信息

2.设计读取地铁信息的命令行

3.需要能输出查询到目的地的所有途经的地铁站点

4.能够算出两个地点间最短路线

5.能够进行性能检测

模块介绍

1.文件subway.txt读取和数据读取                 FileOperate.java    FileOperateOp.java

2.换站转乘最短路径算法                FloydInGraph       GetStation.java  Relative.java

3.输入输出                       Subway.java

输入格式

1.实现地铁线路的加载

-map subway.txt //将存储在subway.txt文件里的地铁线路进行读取

2.实现查询指定线路所有站点

-a 地铁线路名称 -map subway.txt -o station.txt 

3.实现查询指定两个站点间的最短路径

-b 起始站点 目的站点 -map subway.txt -o routine.txt 

文件数据读入

class FileOperate {
     public List<String> getFile(String path){
        List<String> line = new ArrayList();

        try {
                File file = new File(path);
                InputStream in = new FileInputStream(file);
                Reader reader = new InputStreamReader(in, "utf-8");
                BufferedReader br = new BufferedReader(reader);
                String s;
                while ((s = br.readLine()) != null) {
                    line.add(s);
                }
                br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return line;
    }



public
List<String> getFileSpecLine(String path1,int startNum,int endNum){ List<String> line=new ArrayList(); for(int i=startNum;i<endNum;i++){ line.add(getFile(path1).get(i)); } return line; } public void writeFile(String line1,String path1){ try { FileWriter writer=new FileWriter(path1); BufferedWriter bw=new BufferedWriter(writer); bw.write(line1); bw.close(); }catch(Exception e){ e.printStackTrace(); } }

最短路径算法

class FloydInGraph {

    private static int INF = Integer.MAX_VALUE;
    //dist[i][j]=INF<==>i 和 j之间没有边
    private int[][] dist;
    //顶点i 到 j的最短路径长度,初值是i到j的边的权重
    private int[][] path;
    public int [] path1;
    private List<Integer> result = new ArrayList<Integer>();

    public List<Integer> getPath(int num1,int num2) {
        FloydInGraph graph = new FloydInGraph(15);
        int i=0;
        int[][] matrix =
               /* {{INF, 30, INF, 10, 50}, {INF, INF, 60, INF, INF}, {INF, INF, INF, INF, INF}, {INF, INF, INF, INF, 30},
                        {50, INF, 40, INF, INF},};*/
               {{INF,INF,2,4,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF},
                {INF,INF,INF,INF,3,2,INF,INF,INF,INF,INF,INF,INF,INF,INF},
                {INF,6,INF,INF,INF,INF,3,INF,INF,INF,INF,INF,INF,INF,INF},
                {INF,INF,3,INF,INF,INF,INF,3,INF,INF,INF,INF,INF,INF,INF},
                {INF,INF,INF,INF,INF,2,INF,INF,INF,INF,5,INF,INF,INF,INF},
                {INF,INF,INF,INF,INF,INF,4,INF,4,INF,INF,INF,INF,INF,INF},
                 {INF,INF,INF,INF,INF,INF,INF,3,3,3,INF,INF,INF,INF,INF},
                 { INF,INF,INF,INF,INF,INF,INF,INF,INF,3,INF,INF,INF,INF,INF},
                       { INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,5,2,INF,INF,INF},
        { INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,1,INF,INF,INF},
        {INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,4,INF,INF},
        {INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,2},
        {INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,1,INF},
        {INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,1,INF,1},
        {INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,1,INF},};

        int begin = num1;
        int end = num2;
        graph.findCheapestPath(begin, end, matrix);
        List<Integer> list = graph.result;
       /* System.out.println(begin + " to " + end + ",the cheapest path is:");
        System.out.println(list.toString());
        System.out.println(graph.dist[begin][end]);*/
        Iterator it=list.iterator();
       /* while(it.hasNext()){
            Object obj=it.next();
           System.out.println(obj);

        }*/

        return list;
    }

    void findCheapestPath(int begin, int end, int[][] matrix) {
        floyd(matrix);
        result.add(begin);
        findPath(begin, end);
        result.add(end);
    }

    void findPath(int i, int j) {
        int k = path[i][j];
        if (k == -1) {
            return;
        }
        findPath(i, k);   //递归
        result.add(k);
        findPath(k, j);
    }

    void floyd(int[][] matrix) {
        int size = matrix.length;
        //initialize dist and path
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                path[i][j] = -1;
                dist[i][j] = matrix[i][j];
            }
        }
        for (int k = 0; k < size; k++) {
            for (int i = 0; i < size; i++) {
                for (int j = 0; j < size; j++) {
                    if (dist[i][k] != INF &&
                            dist[k][j] != INF &&
                            dist[i][k] + dist[k][j] < dist[i][j]) {
                        dist[i][j] = dist[i][k] + dist[k][j];
                        path[i][j] = k;
                    }
                }
            }
        }

    }

    public FloydInGraph(int size) {
        this.path = new int[size][size];
        this.dist = new int[size][size];
    }
}

规定内容格式

  public FileOperateOp(String str, String str1, String str2, String str3, String str4, String str5) {
             if(str.equals("-a") && str4.equals("-o") && str2.equals("-map")){
                 char ch=str1.charAt(0);
                 switch(ch){
                     case '1' : {getFilePrint(str3,0);writeFile(getFile(str3).get(0),str5);break;}
                     case '2' : {getFilePrint(str3,1);writeFile(getFile(str3).get(1),str5);break;}
                    ......
            ...... default:System.out.println("error"); } }else{ System.out.println("command error!"); } }

读入的文本文件(其中f代表普通站点,t代表转乘站点,站点间用空格分隔):

1号线: 苹果园 f 古城 f 八角游乐园 f 八宝山 f 玉泉路 f 五棵松 f 万寿路 f 公主坟 t 军事博物馆 t 木樨地 f 南礼士路 f 复兴门 t 西单 t 天安门西 f 天安门东 f 王府井 f 东单 t 建国门 t 永安里 f 国贸 t 大望路 t 四惠 t 四惠东 t 
2号线: 积水潭 t 鼓楼大街 t 安定门 f 雍和宫 t 东直门 t 东四十条 f 朝阳门 t 建国门 t 北京站 f 崇文门 t 前门 f 和平门 f 宣武门 t 长椿街 f 复兴门 t 阜成门 f 车公庄 t 西直门 t 积水潭 t
4号线大兴线: 安河桥北 f 北宫门 f 西苑 t 圆明园 f 北京大学东门 f 中关村 f 海淀黄庄 t 人民大学 f 魏公村 f 国家图书馆 t 动物园 f 西直门 t 新街口 f 平安里 t 西四 f 灵境胡同 f 西单 t 宣武门 t 菜市口 t 陶然亭 f 北京南站 t 马家堡 f 角门西 t 公益西桥 f 新宫 f 西红门 f 高米店北 f 高米店南 f 枣园 f 清源路 f 黄村西大街 f 黄村火车站 f 义和庄 f 生物医药基地 f 天宫院 f
5号线: 天通苑北 f 天通苑 f 天通苑南 f 立水桥 t 立水桥南 f 北苑路北 f 大屯路东 t 惠新西街北口 f 惠新西街南口 t 和平西桥 f 和平里北桥 f 雍和宫 t 北新桥 f 张自忠路 f 东四 t 灯市口 f 东单 t 崇文门 t 磁器口 t 天坛东门 f 蒲黄榆 t 刘家窑 f 宋家庄 t 
6号线: 金安桥 t 杨庄 f 西黄村 f 廖公庄 f 田村 f 海淀五路居 f 慈寿寺 t 花园桥 f 白石桥南 t 车公庄西 f 车公庄 t 平安里 t 北海北 f 南锣鼓巷 t 东四 t 朝阳门 t 东大桥 f 呼家楼 t 金台路 t 十里堡 f 青年路 f 褡裢坡  f 黄渠 f 常营 f 草房 f 物资学院路 f 通州北关 f 北运河西 f 北运河东 f 郝家府 f 东夏园 f 潞城 f
7号线: 北京西站 t 湾子 f 达官营 f 广安门内 f 菜市口 t 虎坊桥 f 珠市口 t 桥湾 f 磁器口 t 广渠门内 f 广渠门外 f 九龙山 t 大郊亭 f 百子湾 f 化工 f 南楼梓庄 f 欢乐谷景区 f 垡头 f 双合 f 焦化厂 f 
8号线: 朱辛庄 t 育知路 f 平西府 f 回龙观东大街 f 霍营 t 育新 f 西小口 f 永泰庄 f 林萃桥 f 森林公园南门 f 奥林匹克公园 t 奥体中心 f 北土城 t 安华桥 f 安德里北街 f 鼓楼大街 t 什刹海 f 南锣鼓巷 t 中国美术馆 f 8号线南段: 珠市口 t 天桥 f 永定门外 t 木樨园 f 海户屯 f 大红门南 f 和义 f 东高地 f 火箭万源 f 五福堂 f 德茂 f 瀛海 f 
9号线: 国家图书馆 t 白石桥南 t 白堆子 f 军事博物馆 t 北京西站 t 六里桥东 f 六里桥 t 七里庄 t 丰台东大街 f 丰台南路 f 科怡路 f 丰台科技园 f 郭公庄 t
10号线: 巴沟 t 苏州街 f 海淀黄庄 t 知春里 f 知春路 f 西土城 f 牡丹园 f 健德门 f 北土城 t 安贞门 f 惠新西街南口 t 芍药居 t 太阳宫 f 三元桥 t 亮马桥 f 农业展览馆 f 团结湖 f 呼家楼 t 金台夕照 f 国贸 t 双井 f 劲松 f 潘家园 f 十里河 t 分钟寺 f 成寿寺 f 宋家庄 t 石榴庄 f 大红门 f 角门东 f 角门西 t 草桥 t 纪家庙 f 首经贸 f 丰台站 f 泥洼 f 西局 t 六里桥 t 莲花桥 f 公主坟 t 西钓鱼台 f 慈寿寺 t 车道沟 f 长春桥 f 火器营 f 巴沟 t 
13号线: 西直门 t 大钟寺 f 知春路 f 五道口 f 上地 f 西二旗 t 龙泽 f 回龙观 f 霍营 t 立水桥 t 北苑 f 望京西 t 芍药居 t 光熙门 f 柳芳 f 东直门 t
14号线西段: 张郭庄 f 园博园 f 大瓦窑 f 郭庄子 f 大井 f 七里庄 t 西局 t 
14号线东段: 北京南站 t 永定门外 t 景泰 f 蒲黄榆 t 方庄 f 十里河 t 北工大西门 f 平乐园 f 九龙山 t 大望路 t 金台路 t 朝阳公园 f 枣营 f 东风北桥 f 将台 f 望京南 f 阜通 f 望京 t 东湖渠 f 来广营 f 善各庄 f 
15号线: 清华东路西口 f 六道口 f 北沙滩 f 奥林匹克公园 t 安立路 f 大屯路东 t 关庄 f 望京西 t 望京 t 望京东 f 崔各庄 f 马泉营 f 孙河 f 国展 f 花梨坎 f 后沙峪 f 南法信 f 石门 f 顺义 f 俸伯 f
16号线: 北安河 f 温阳路 f 稻香湖路 f 屯佃 f 永丰 f 永丰南 f 西北旺 f 马连洼 f 农大南路 f 西苑 t
八通线: 四惠 t 四惠东 t 高碑店 f 传媒大学 f 双桥 f 管庄八里桥 f 通州北苑 f 果园 f 九棵树 f 梨园 f 临河里 f 北桥 f
昌平线: 昌平西山口 f 十三陵景区 f 昌平 f 昌平东关 f 北邵洼 f 南邵 f 沙河高教区 f 沙河 f 巩华城 f 朱辛庄 t 生命科学园 f 西二旗 t 
亦庄线: 宋家庄 t 肖村 f 小红门 f 旧宫 f 亦庄桥 f 亦庄文化园 f 万源街 f 容京东街 f 荣昌东街 f 同济南路 f 经海路 f 次渠南 f 次渠 f 亦庄火车站 f 
房山线: 郭公庄 t 大葆台 f 稻田 f 长阳 f 篱笆房 f 广阳城 f 良乡大学城北 f 良乡大学城 f 良乡大学城西 f 良乡南关 f 苏庄 f 阎村东 t 
机场线: 东直门 t 三元桥 t T2/T3航站楼 f 
s1线: 石厂 f 小园 f 栗园庄 f 上岸 f 桥户营 f 四道桥 f 金安桥 t 
燕房线: 燕山 f 房山城关 f 饶乐府 f 马各庄 f 大石河东 f 星城 f 阎村 f 紫草坞 f 阎村东 t
西郊线: 香山 f 植物园 t 万安 f 茶棚 f 颐和园西门 f 巴沟 t
新机场线: 草桥 t 大兴新城 f 大兴机场 f

读入所有的地铁线路和地铁站点    -map

功能1
1号线: 苹果园 -> 古城 -> 八角游乐园 -> 八宝山 -> 玉泉路 -> 五棵松 -> 万寿路 -> 公主坟 -> 军事博物馆 -> 木樨地 -> 南礼士路 -> 复兴门 -> 西单 -> 天安门西 -> 天安门东 -> 王府井 -> 东单 -> 建国门 -> 永安里 -> 国贸 -> 大望路 -> 四惠 -> 四惠东 -> 
2号线: 积水潭 -> 鼓楼大街 -> 安定门 -> 雍和宫 -> 东直门 -> 东四十条 -> 朝阳门 -> 建国门 -> 北京站 -> 崇文门 -> 前门 -> 和平门 -> 宣武门 -> 长椿街 -> 复兴门 -> 阜成门 -> 车公庄 -> 西直门 -> 积水潭 ->
4号线大兴线: 安河桥北 -> 北宫门 -> 西苑 -> 圆明园 -> 北京大学东门 -> 中关村 -> 海淀黄庄 -> 人民大学 -> 魏公村 -> 国家图书馆 -> 动物园 -> 西直门 -> 新街口 -> 平安里 -> 西四 -> 灵境胡同 -> 西单 -> 宣武门 -> 菜市口 -> 陶然亭 -> 北京南站 -> 马家堡 -> 角门西 -> 公益西桥 -> 新宫 -> 西红门 -> 高米店北 -> 高米店南 -> 枣园 -> 清源路 -> 黄村西大街 -> 黄村火车站 -> 义和庄 -> 生物医药基地 -> 天宫院 ->
5号线: 天通苑北 -> 天通苑 -> 天通苑南 -> 立水桥 -> 立水桥南 -> 北苑路北 -> 大屯路东 -> 惠新西街北口 -> 惠新西街南口 -> 和平西桥 -> 和平里北桥 -> 雍和宫 -> 北新桥 -> 张自忠路 -> 东四 -> 灯市口 -> 东单 -> 崇文门 -> 磁器口 -> 天坛东门 -> 蒲黄榆 -> 刘家窑 -> 宋家庄 -> 
6号线: 金安桥 -> 杨庄 -> 西黄村 -> 廖公庄 -> 田村 -> 海淀五路居 -> 慈寿寺 -> 花园桥 -> 白石桥南 -> 车公庄西 -> 车公庄 -> 平安里 -> 北海北 -> 南锣鼓巷 -> 东四 -> 朝阳门 -> 东大桥 -> 呼家楼 -> 金台路 -> 十里堡 -> 青年路 -> 褡裢坡  -> 黄渠 -> 常营 -> 草房 -> 物资学院路 -> 通州北关 -> 北运河西 -> 北运河东 -> 郝家府 -> 东夏园 -> 潞城 ->
7号线: 北京西站 -> 湾子 -> 达官营 -> 广安门内 -> 菜市口 -> 虎坊桥 -> 珠市口 -> 桥湾 -> 磁器口 -> 广渠门内 -> 广渠门外 -> 九龙山 -> 大郊亭 -> 百子湾 -> 化工 -> 南楼梓庄 -> 欢乐谷景区 -> 垡头 -> 双合 -> 焦化厂 -> 
8号线: 朱辛庄 -> 育知路 -> 平西府 -> 回龙观东大街 -> 霍营 -> 育新 -> 西小口 -> 永泰庄 -> 林萃桥 -> 森林公园南门 -> 奥林匹克公园 -> 奥体中心 -> 北土城 -> 安华桥 -> 安德里北街 -> 鼓楼大街 -> 什刹海 -> 南锣鼓巷 -> 中国美术馆 -> 8号线南段: 珠市口 -> 天桥 -> 永定门外 -> 木樨园 -> 海户屯 -> 大红门南 -> 和义 -> 东高地 -> 火箭万源 -> 五福堂 -> 德茂 -> 瀛海 -> 
9号线: 国家图书馆 -> 白石桥南 -> 白堆子 -> 军事博物馆 -> 北京西站 -> 六里桥东 -> 六里桥 -> 七里庄 -> 丰台东大街 -> 丰台南路 -> 科怡路 -> 丰台科技园 -> 郭公庄 ->
10号线: 巴沟 -> 苏州街 -> 海淀黄庄 -> 知春里 -> 知春路 -> 西土城 -> 牡丹园 -> 健德门 -> 北土城 -> 安贞门 -> 惠新西街南口 -> 芍药居 -> 太阳宫 -> 三元桥 -> 亮马桥 -> 农业展览馆 -> 团结湖 -> 呼家楼 -> 金台夕照 -> 国贸 -> 双井 -> 劲松 -> 潘家园 -> 十里河 -> 分钟寺 -> 成寿寺 -> 宋家庄 -> 石榴庄 -> 大红门 -> 角门东 -> 角门西 -> 草桥 -> 纪家庙 -> 首经贸 -> 丰台站 -> 泥洼 -> 西局 -> 六里桥 -> 莲花桥 -> 公主坟 -> 西钓鱼台 -> 慈寿寺 -> 车道沟 -> 长春桥 -> 火器营 -> 巴沟 -> 
13号线: 西直门 -> 大钟寺 -> 知春路 -> 五道口 -> 上地 -> 西二旗 -> 龙泽 -> 回龙观 -> 霍营 -> 立水桥 -> 北苑 -> 望京西 -> 芍药居 -> 光熙门 -> 柳芳 -> 东直门 ->
14号线西段: 张郭庄 -> 园博园 -> 大瓦窑 -> 郭庄子 -> 大井 -> 七里庄 -> 西局 -> 
14号线东段: 北京南站 -> 永定门外 -> 景泰 -> 蒲黄榆 -> 方庄 -> 十里河 -> 北工大西门 -> 平乐园 -> 九龙山 -> 大望路 -> 金台路 -> 朝阳公园 -> 枣营 -> 东风北桥 -> 将台 -> 望京南 -> 阜通 -> 望京 -> 东湖渠 -> 来广营 -> 善各庄 -> 
15号线: 清华东路西口 -> 六道口 -> 北沙滩 -> 奥林匹克公园 -> 安立路 -> 大屯路东 -> 关庄 -> 望京西 -> 望京 -> 望京东 -> 崔各庄 -> 马泉营 -> 孙河 -> 国展 -> 花梨坎 -> 后沙峪 -> 南法信 -> 石门 -> 顺义 -> 俸伯 ->
16号线: 北安河 -> 温阳路 -> 稻香湖路 -> 屯佃 -> 永丰 -> 永丰南 -> 西北旺 -> 马连洼 -> 农大南路 -> 西苑 ->
八通线: 四惠 -> 四惠东 -> 高碑店 -> 传媒大学 -> 双桥 -> 管庄八里桥 -> 通州北苑 -> 果园 -> 九棵树 -> 梨园 -> 临河里 -> 北桥 ->
昌平线: 昌平西山口 -> 十三陵景区 -> 昌平 -> 昌平东关 -> 北邵洼 -> 南邵 -> 沙河高教区 -> 沙河 -> 巩华城 -> 朱辛庄 -> 生命科学园 -> 西二旗 -> 
亦庄线: 宋家庄 -> 肖村 -> 小红门 -> 旧宫 -> 亦庄桥 -> 亦庄文化园 -> 万源街 -> 容京东街 -> 荣昌东街 -> 同济南路 -> 经海路 -> 次渠南 -> 次渠 -> 亦庄火车站 -> 
房山线: 郭公庄 -> 大葆台 -> 稻田 -> 长阳 -> 篱笆房 -> 广阳城 -> 良乡大学城北 -> 良乡大学城 -> 良乡大学城西 -> 良乡南关 -> 苏庄 -> 阎村东 -> 
机场线: 东直门 -> 三元桥 -> T2/T3航站楼 -> 
s1线: 石厂 -> 小园 -> 栗园庄 -> 上岸 -> 桥户营 -> 四道桥 -> 金安桥 -> 
燕房线: 燕山 -> 房山城关 -> 饶乐府 -> 马各庄 -> 大石河东 -> 星城 -> 阎村 -> 紫草坞 -> 阎村东 ->
西郊线: 香山 -> 植物园 -> 万安 -> 茶棚 -> 颐和园西门 -> 巴沟 ->
新机场线: 草桥 -> 大兴新城 -> 大兴机场 ->

 显示某一条线路的所有站点

-a", "2号线", "-map

功能2   
2号线: 积水潭 -> 鼓楼大街 -> 安定门 -> 雍和宫 -> 东直门 -> 东四十条 -> 朝阳门 -> 建国门 -> 北京站 -> 崇文门 -> 前门 -> 和平门 -> 宣武门 -> 长椿街 -> 复兴门 -> 阜成门 -> 车公庄 -> 西直门 -> 积水潭 ->

-a", "6号线", "-map

功能2
6号线: 金安桥 -> 杨庄 -> 西黄村 -> 廖公庄 -> 田村 -> 海淀五路居 -> 慈寿寺 -> 花园桥 -> 白石桥南 -> 车公庄西 -> 车公庄 -> 平安里 -> 北海北 -> 南锣鼓巷 -> 东四 -> 朝阳门 -> 东大桥 -> 呼家楼 -> 金台路 -> 十里堡 -> 青年路 -> 褡裢坡 -> 黄渠 -> 常营 -> 草房 -> 物资学院路 -> 通州北关 -> 北运河西 -> 北运河东 -> 郝家府 -> 东夏园 -> 潞城 ->

猜你喜欢

转载自www.cnblogs.com/zucc31701081/p/11673866.html