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

一、前言

现实和理想的差距总是那么大,在过程中碰到的坑比预期的还多(说那么多,其实就是自己菜),过程中复习了淡忘已久的许多算法和数据结构,一边深刻的体会着自己是多菜,一边也体会到了自身一点点微小的进步,大概。

二、项目简介

实现北京地铁查询功能

附上一张北京地铁的图:

三、项目地址

https://github.com/fireworks-EX/MetroLinePlanning

四、需求分析

1、确定储存及读取地铁线路数据文件的格式

2、支持用户输入的地铁线路的查询

3、提供用户指定两站点间的最短乘车路径的方案(可换乘)

五、数据存储格式

1、subway.txt存储的地图数据文本,使用json格式:

[
    {
        ‘Line‘ : ‘S1线‘,
        ‘Station‘ : [‘金安桥‘, ‘四道桥‘, ‘桥户营‘, ‘上岸‘, ‘栗园庄‘, ‘小园‘, ‘石厂‘]
    },
        ………………
        ………………
        ………………
]

‘Line‘为线路名称,‘Station‘ 为站名。

2、数据的读取和保存

    public static String readJsonData(String pactFile){    //读入json格式的地铁路线信息
        StringBuffer strbuffer = new StringBuffer();
        File myFile = new File(pactFile);
        if (!myFile.exists()) {
            System.err.println("没有找到文件: " + pactFile);
        }
        try {
            FileInputStream fis = new FileInputStream(pactFile);
            InputStreamReader inputStreamReader = new InputStreamReader(fis, "GBK");
            BufferedReader in  = new BufferedReader(inputStreamReader);
            String str;
            while ((str = in.readLine()) != null) {
                strbuffer.append(str);
            }
            in.close();
        } catch (IOException e) {
            e.getStackTrace();
        }
        return strbuffer.toString();
    }

    public static String getPath(String fileName) {        //获取文件路径
        String path = Subway.class.getResource("").toString() + fileName;
        path = path.replace("file:/", "");
        path = path.replace("/", "//");
        return path;
    }

    public static boolean save(String path, String sets) throws IOException {    //保存文件
        FileWriter fw;
        File f=new File(path);
        if (!f.exists()) {
            f.createNewFile();
        }
        FileOutputStream fos1=new FileOutputStream(f);
        OutputStreamWriter dos1=new OutputStreamWriter(fos1);
        dos1.write(sets);
        dos1.write("\n");
        dos1.close();

        return true;
    }

运行截图:

主界面:

读取成功提示:

读取成功后显示地铁线路所有信息:

UI自己写的,太丑勿喷

六、具体功能实现

1、邻接表定义:

    public class ENode {//定义边节点
        int ivex;       // 该边所指向的顶点的位置
        ENode nextEdge; // 指向下一条弧的指针
    }

    public class VNode {    //定义顶点节点
        final static int inf = Integer.MAX_VALUE; //代表距离无限大
        String data;        // 顶点信息(站点名字)
        ENode firstEdge;    // 指向该顶点所连接的边
        int dist;            // 距离
        boolean flag;        // 标记(是否被访问过,dijkstra算法中用到)
        VNode parent;        // 父节点(即前一站)

        public VNode() {        //无参构造器
            this.dist = inf;    //初始化距离为无限大
            this.flag = false;    //初始化节点未访问
            this.parent=null;    //初始化父结点为空
        }
    }

    private static VNode[] mVexs;      // 顶点数组(构造邻接表)

这里其实写麻烦了,跟当初写C语言一样自己定义,弄得后面功能实现麻烦了很多,如果用map之类的写会简单很多。

2、bfs计算最短路径:

    private static void bfs(VNode v1, String s){  //更新路径信息
        List<VNode> queue = new LinkedList<VNode>();
        queue.add(v1);
        while(true) {
            int count=queue.size();
            for(int i=0;i<count;i++) {
                VNode v = queue.get(0);
                if(v != null) {
                    ENode node = v.firstEdge;
                    while (node != null) {
                        VNode childVNode = mVexs[node.ivex];
                        if(childVNode.flag==false)
                        {
                            childVNode.flag=true;        //将标志置为true,表示该节点已被访问
                            childVNode.dist=v.dist+1;    //距离+1
                            childVNode.parent=v;        //将该节点设为父结点(为了便于回溯)
                            if(childVNode.data.equals(s)) return;
                            queue.add(childVNode);
                        }
                        node = node.nextEdge;
                    }
                }
                queue.remove(0);
            }
        }

    }

应该是bfs吧,大概,按自己的理解写的,没参考网上代码,可能比较垃圾,不要见怪

3、………………

其他代码太长就不贴了,具体可去我的GitHub上看,链接已在文章开头给出

顺便附上部分运行截图:

查看某指定路线:

查询两站点间最短路径:

该最短路径可以保存到本地txt文件:

因为获取了开始读取的subway.txt中的线路站点信息,并用下拉框的形式进行选择,确保了不会有非法输入,省去了异常判断的处理。

附录:

从GitHub上下载项目后,eclipse导入项目

    

然后发现报红,原因是json的jar包还没有导入

     

要是还是报错的话,额,麻烦自己new个新的java project,再把代码copy过去,然后把subway.txt  copy到bin目录下。

原文地址:https://www.cnblogs.com/wzw-blog/p/11667087.html

时间: 2024-07-28 20:50:07

个人项目——北京地铁线路规划的相关文章

个人项目--北京地铁线路规划(已完成)

一.任务: 实现一个帮助进行北京地铁出行路线规划的命令行程序. 二.需求分析及实现 需求1 在程序启动时,自动获取到地图信息 需要实现一个支持自动加载subway.txt 文件的程序 需求2 查询指定地铁线经过的站点 在应用程序上,需要支持一个新的命令行参数  -a ,指定用户希望查询的地铁线路. 在给定地铁线路时,程序需要从线路的起始站点开始,依次输出该地铁线经过的所有站点,直到终点站.输出的文件使用-o参数来指定. 一个调用应用程序的示例如下: java subway -a 1号线 -map

北京地铁线路规划

北京地铁线路规划 任务 个人项目的主要任务就是通过地铁出行的人能够通过该软件很快找到最快到达目的地的出行线路规划. 项目需求 用户根据-map参数来获得所有北京地铁线路信息 java subway -map subway.txt 那么这里的重点就在于如何存储这个subway.txt文件了,首先我们还是看一张北京地铁1号线的图 ![](https://img2018.cnblogs.com/blog/1806411/201909/1806411-20190922113916097-18761194

北京地铁线路规划系统

北京地铁线路规划系统 项目概况 本次项目是以邻接表的形式来存储图,通过Folyd算法算出任意两点之间的路线图并以数字的形式来代替站点名称存储在dist1.txt文件中并保存在本地.等用户通过输入各种命令,再从本地读入subway.txt文件或者dist1.txt文件进行相应输出. java图实现 首先创建Vertex类(存储每个点的信息) private String verName; private Vertex nextNode = null; private int verId; priv

北京地铁出行规划

一.Github代码链接     repo 二.程序基本功能描述 1.获得北京地铁单条线路所有站点信息 java SubwayStart -a 线路名称 -map 地铁线路文件.txt-o 输出文件.txt 或者 java SubwayStart -a 线路名称(直接显示) -map 地铁线路文件.txt 2.获得两个站点间最短线路 java SubwayStart -b 起始站点 目的站点 -map 地铁线路文件.txt -o 输出文件.txt 或者 java SubwayStart -b 起

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

一  问题重述 1.实现地铁线路的加载 2.实现查询指定线路所有站点(包括换乘信息) 3.实现查询指定两个站点间的最短路径 二  功能设计 1.实现地铁线路的加载 -map subway.txt //将存储在subway.txt文件里的地铁线路进行读取 2.实现查询指定线路所有站点 -a 地铁线路名称 -map subway.txt -o station.txt //读取subway.txt文件信息后,通过输入的地铁线路名称,将指定地铁线路的所有站点写入station.txt文件 3.实现查询指

个人项目——地铁线路规划

个人项目-地铁线路规划系统 GitHub项目地址:https://github.com/ye1014239226/Subway1.git 问题描述 1.输入地铁线路的名字,显示该线路上的站点信息 2.输入起末站的站点名字,输出最优的换乘路线(经过站点数量最少) 解决思路 1.收集北京地铁的线路信息,存入txt文件中,并导入到设计的数据存储方式中去 2.读入数据并且构建地铁线路图的数据结构 3.使用迪杰斯特拉算法求最短的换乘路径 4.测试 解决过程 1.数据存储 txt的存储形式如下 线路名 站点

北京地铁线路规划程序

程序说明: 这个项目是记录地铁线路并且加以计算,所以储存线路是其中的关键部分. 经过慎重的思考以及选择,最后决定采用链表的形式储存整个地图,因为地图的站点分布不均匀,采用邻接矩阵很不合适无法对齐,这样的方式也比邻接链表要方便. 最终的储存结构中,每个站点都有一个单独的station对象,并且储存了相关的信息,站与站之间按照线路排列,每一条线路的起点被专门放在一个数组里面方便访问. 问题地址:http://www.cnblogs.com/jiel/p/5852591.html 输入文件说明: 保存

最短路径(图论-北京地铁线路查询)

目录 1 int main(){ 2 3 printf("北京地铁乘坐线路查询系统\n"); 4 /*---------------------------------------------------*/ 5 6 /*---------------------------------------------------*/ 7 freopen("bgstations.txt","r",stdin); 8 int LINE; /*地铁总线数*/

地铁线路规划

一.预期计划 1.选择合适的文件储存地铁路线的信息. 2.设计关于地铁信息的IO程序. 3.用户可以查询地铁信息. 4.可以推荐输入站点之间的最短路径. 5.代码复审已经性能测试. 二.需求分析 1.将地铁的具体信息储存在文件中,包括站点名称.线路名称等,要确定文件的格式,保证文件能够方便读取. 2.用户输入指定线路或者起始站和终点站,系统要给出相应的推荐线路,列出途径的站点. 3.提供查询功能,输入线路名称后系统输出这条线路上的全部站点. 三.设计思路 1.最关键的算法是查找最短路径,即在图中