北京地铁换乘系统

北京市地铁图

GIthu地址:https://github.com/wuzufeng/beijingsubway

一.设计分析

  在北京地铁换乘系统中,我将整个系统主要分成了3个主要模块,分别为:主控模块,IO模块,算法模块。而我认为在这3个模块中最复杂,也是最棘手的模块就是IO模块,因为在本次实验前我对Java的IO操作没有什么了解,所以我首先查询了关于Java的IO方面的资料和代码,对其有了一定的了解后,在按需求设计完成主模块后,我先设计了系统的读入文件模块。

主模块

package main;
import manager.*;

public class Main {
    //主函数
    public static void main(String[] args) throws Exception {
        //-map 地图读入
        if(args[0].equals("-map")){
            readMap(args[1]);
            System.out.println("地图读取成功!");
        }
        // -a 地铁线站点输出
        else if (args[0].equals("-a")){
            readMap(args[3]);
            manager.LineManager.check(args[1]);
            //读取
            FileWrite.outstation(args[1],args[5]);
            System.out.println("车站信息输出成功!");
        }
        // -b 最短路径查询
        else if(args[0].equals("-b")){
            readMap(args[4]);
            ShortestPath.makeTb();
            //读取输出文件,起点和终点
            FileWrite.outroutine(args[6],args[1],args[2]);
            System.out.println("路线信息输出成功!");
        }
        else{
            System.out.println("请输入指定命令进行相应操作!");
        }
    }
    //地图文件读取
    public static void readMap(String x) throws Exception {
        String readfile =x;
        manager.Map.in(readfile);
        manager.LineManager.statisticsStation();
        manager.Map.getHashMap();
        Map.setMap();
        manager.LineManager.readline(readfile);
    }

}

  我先设计了station和line两个类,用于储存地铁站,地铁线路和其他相关信息

station

package model;

import java.util.*;
public class Station {
    private String stationName;     //站点名称
    private Set<Line>lineName;      //所属地铁线
    private Set<Station>linkStations; //相连的地铁站

    //获得站点名称
    public String getStationName() {

        return stationName;
    }

    //获得站点相连的站点
    public Set<Station> getlinkStations() {

        return linkStations;
    }

    //为站点添加所在地铁线
    public void addLineName(Line lineName) {

        this.lineName.add(lineName);
    }

    //为当前站点添加相邻站点
    public void addlinkStations(Station linkStations) {

        this.linkStations.add(linkStations);
    }

    //添加一个站点包括它的名称,附近相连站点,所在线路站点
    public Station(String stationName) {
        this.stationName=stationName;
        linkStations= new HashSet<>();
        lineName= new HashSet<>();
    }
}

line

package model;
import java.util.*;
public class Line {
    private List<Station>stations;   //所经过站点
    //返回地铁站当前的站点
    public List<Station> getStations() {
        return stations;
    }

    //为地铁线路添加站点
    public void addStation(Station station) {
        this.stations.add(station);
    }

    //添加地铁线和其经过的站点
    public Line() {
        stations= new ArrayList<>();
    }
}

再将subway.txt的格式设计为

s1号线 金安桥 四道桥 桥户营 上岸 栗园庄 小园 石厂
1号线 苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨地 南礼士路 复兴门 西单 天安门西 天安门东 王府井 东单 建国门 永安里 国贸 大望路 四惠 四惠东
2号线 西直门 车公庄 阜成门 复兴门 长椿街 宣武门 和平门 前门 崇文门 北京站 建国门 朝阳门 东四十条 东直门 雍和宫 安定门 鼓楼大街 积水潭 西直门

方便程序读入。

在这之后便是要将储存的数据转化为HashMap并制作矩阵(为后面使用弗洛伊德算法做准备),这里我设计了manager.Map类。

接下来就是算法模块的,本次需求要求实现的功能主要有3点,一是实现地图的读取(已在IO模块实现),二是输出指定路线所经过的站点,三是根据输入的2个不同站点,输出最短线路(经过站最少)。

输出指点站点线路的工作比较简单,我设计了line模块解决

package manager;

import model.Station;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class LineManager {
    public static java.util.Map<String, model.Line> lines;

    public static List<String> check(String linename){
        model.Line line=lines.get(linename);
        List<Station>stations=line.getStations();
        List<String>strings=new ArrayList<String>();
        for(Station station:stations){
            strings.add(station.getStationName());
        }
        return strings;
    }

    public static Set<List<String>> readline(String filename) throws Exception {
        FileInputStream inputStream = new FileInputStream(filename);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        Set<List<String>>set=new HashSet<List<String>>();
        String str = null;
        while ((str = bufferedReader.readLine()) != null) {

            String[] lineInformations = str.split(" ");
            List<String>stations=new ArrayList<String>();
            for (String s : lineInformations) {
                stations.add(s);

            }
            set.add(stations);
        }
        //close
        inputStream.close();
        bufferedReader.close();
        return set;
    }
    public static void statisticsStation() {
        for (List<String> lineList : manager.Map.listSet)
            for (int i = 1; i < lineList.size(); i++)
                manager.Map.set.add(lineList.get(i));
    }
}

接下来是比较难的寻找最短路径模块

package manager;

import model.Station;
import java.util.ArrayList;
import java.util.List;

public class ShortestPath {
    public static int len;
    public static int[][] path;
    public static int[][] dist;
    public static int[][] table;
    public static int INF = Integer.MAX_VALUE;   //设置INF无限大
    public static List<Integer> result = new ArrayList<Integer>();
    public static void findFloydRoad(int[][] table) {
        int size = len;
        path = new int[size][size];
        dist = new int[size][size];
        //initialize dist and path
        System.out.println(size);
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                path[i][j] = -1;
                dist[i][j] = table[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 static void makeTb(){
        len = manager.Map.map.size();
        table =new int[len][len];
        for(int i=0;i<len;i++){
            for(int  j=0;j<len;j++){
                table[i][j]=INF;
            }
        }
        for(int i=0;i<len;i++){
            Station station=manager.Map.map.get(i);
            for(Station s:station.getlinkStations()){
                int j=manager.Map.numMap.get(s.getStationName());
                table[i][j]=1;
                table[j][i]=1;
            }
        }
    }
    public static void findCheapestPath(int begin, int end, int[][] table) {
        ShortestPath.findFloydRoad(table);
        result.add(begin);
        findPath(begin, end);
        result.add(end);
    }

    public  static void findPath(int i, int j) {
        int k = path[i][j];
        if (k == -1)        //当k=-1时,递归结束,否则一直递归
            return ;
        else {
            findPath(i, k);
            result.add(k);
            findPath(k, j);
        }
    }
}

在完成这些工作后,便要设计输出模块,将相关结果输出到txt文件中 这里我设计了FileWrite类专门解决这个问题

package manager;
import main.Main;
import model.Station;
import java.io.*;

public class FileWrite {
    public static void outstation(String linename,String fileName) throws Exception {
        if(fileName.equals("")||fileName.equals(" ")){
            System.out.println("输出文件名不能为空!");
        }
        else if(linename.equals("")||linename.equals(" ")){
            System.out.println("查询线路名不能为空");
        }
        else {
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName)));
            out.write(linename+"所经过的站点有");
            out.newLine(); //换行
            for (Station s : manager.LineManager.lines.get(linename).getStations()) {
                out.write(s.getStationName());
                out.newLine();
            }
            out.flush();
            out.close();
        }

    }

    public static void outroutine(String fileName,String a,String b) throws Exception {
        if(fileName.equals("")||fileName.equals(" ")){
            System.out.println("输出文件名不能为空!");
        }
        else {
            int x =manager.Map.numMap.get(a);
            int y =manager.Map.numMap.get(b);
            ShortestPath.findCheapestPath(x, y, ShortestPath.table);
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName)));
            out.write(" 从 " + manager.Map.map.get(x).getStationName() + " 到 " + manager.Map.map.get(y).getStationName() + " 一共历经" + ShortestPath.dist[x][y] + "站" + " 的最佳路径是 ");
            out.newLine();  //换行
            for (int r : ShortestPath.result) {
                if (!manager.Map.map.get(r).getStationName().equals(manager.Map.map.get(x).getStationName())) {
                    out.write("  |");
                    out.newLine();
                }
                out.write(manager.Map.map.get(r).getStationName());
                out.newLine();
            }
            out.flush();
            out.close();
        }
    }
}

完成到这一步,基本完成了实验需求

二.程序测试

1  -map subway.txt

2 -a 1号线 -map subway.txt -o station.txt

-b 苹果园 北京站 -map subway.txt -o routine.txt

 4. -c

三.心得总结

  本次个人实验让我个人有许多收获,在本次实验前,我对Java的理解与掌握更多是在数据库方面,而这次实验让我对Java的IO ,交互和算法实现的方面有了更清晰的认识。更重要的是,我对软件工程和软件设计过程有了一个比较清晰的认识,并了解了软件工程的具体流程。虽然这次实验参考了大量的外部资料并仍存在许多不足,但是这次实验就行打开软件工程大门的敲门砖,让我收获匪浅。

原文地址:https://www.cnblogs.com/31701052wzf/p/11679371.html

时间: 2024-10-09 03:41:22

北京地铁换乘系统的相关文章

用Python计算北京地铁的两站间最短换乘路线

用Python计算北京地铁的两站间最短换乘路线 地铁数据 地铁数据用字典表示: {station:{neighbor1:line number,neighbor2:line number,-},station2:{-},-} 现在我们有地铁的站名,下面就是如何将地铁站名转化为上面所需要的标准字典格式. 从网上找到的地铁站名为字符串: line1=u'''苹果园 古城路 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨地 南礼士路 复兴门 西单 天安门西 天安门东 王府井 东单

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

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

北京地铁和广州地铁之感想

在北京生活了八年,前年回到广州,日常出行就靠地铁公交这些公共交通工具.对比帝都和羊城的地铁,各有各的特点.帝都地铁历史更悠久,线路更多:由于北京道路一般是横平竖直,地铁站命名更规律,十字路口的东北出入口为A,然后按顺时针分布依次为ABCD.羊城地铁最早的一号线建于九十年代,其他比起帝都地铁更新更先进,建设之初就通达机场各大火车站,更便捷.换成也比北京地铁方便,一般上下楼梯就可以换乘,不像北京地铁要绕很远才能换乘. 就日常使用来说,相对而言帝都地铁细节设计实用性更高一些,更人性化.例如:1.帝都地

Arcgis for js实现北京地铁的展示

概述: 通过获取百度地铁图数据,将北京市地铁图在Arcgis for js中实现展示. 效果: 初始化效果 放大后 鼠标经过线路高亮并显示名称 点击显示站点信息 实现: 1.获取地铁数据 a.打开百度地铁图 在chrom中输入地址http://map.baidu.com/subways/index.html?c=beijing b.获取网络资源 按下f12,切换到NetWork面板,刷新页面,会出现如下所示: 在新的面板中打开对应的链接,即为北京地铁的原始数据,格式为xml c.将xml转换为j

设计模式之策略模式在地铁票价系统中的应用

引言 设计模式是面向对象编程的一个非常精彩的部分.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性,它能帮助我们将应用组织成容易了解,容易维护,具有弹性的架构.本文通过一个简单的案例来讲述策略模式在地铁票价系统中的应用. 案例描述 乘客从一个车站乘坐地铁到另一个车站,他/她需要购买一张票.铁路部门对于票价有一些特别的票价规定: 按照市物价主管部门批复的轨道交通网络票价体系,即:轨道交通实行按里程计价的多级票价,0~6公里3元,6公里之后每10公里增加1元;票价计算采用最短路径

北京地铁乘坐线路查询

[问题描述] 编写一个程序实现北京地铁最短乘坐(站)线路查询,输入为起始站名和目的站名,输出为从起始站到目的站的最短乘坐站换乘线路.注:1. 要求采用Dijkstra算法实现:2)如果两站间存在多条最短路径,找出其中的一条就行. [输入形式] 文件bgstations.txt为数据文件(可从课程网站中课程信息处下载),包含了北京地铁的线路及车站信息.其格式如下: <地铁线路总条数> <线路1> <线路1站数> <站名1> <换乘状态> <站

北京地铁线路规划

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

北京地铁最短路径实现

北京地铁最短路径规划 github地址 github 需求理解 将地铁线路保存成一个可读入,简洁明了的文本 程序能正确读入这个文件,并获取地铁线路信息 程序能正确处理输入的命令行 地铁能正确输出指定地铁线经过的站点 程序能正确输出两个站点间的最短路径 程序要有健壮性,能通过各类性能测试 按要求编写博客,详细说明花费时间,代码,各个模块和测试用例 文本存储方式 该文本直接保存进了各条线路的各个站点,没有在文本中考虑换乘点.当读入"一号线"等文字时,将它转换为线路的id号,然后在way数组

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

一.前言 现实和理想的差距总是那么大,在过程中碰到的坑比预期的还多(说那么多,其实就是自己菜),过程中复习了淡忘已久的许多算法和数据结构,一边深刻的体会着自己是多菜,一边也体会到了自身一点点微小的进步,大概. 二.项目简介 实现北京地铁查询功能 附上一张北京地铁的图: 三.项目地址 https://github.com/fireworks-EX/MetroLinePlanning 四.需求分析 1.确定储存及读取地铁线路数据文件的格式 2.支持用户输入的地铁线路的查询 3.提供用户指定两站点间的