北京地铁出行路径规划

GitHUB源码

GitHUB源码

项目需求

需求1:实现一个支持显示地铁线路与计算换乘的程序
对于地铁路线的数据,将使用subway.txt文件来存储。
对于地铁线路信息图,采用参数 -map 作为标志,例如:

java subway -map subway.txt
需求2:实现地铁线路查询功能
对于地铁线路信息图,采用-a 来指定地铁路线,采用参数 -o 来输出到指定文件station.txt,例如:

java subway -a 1号线 -map subway.txt -o station.txt
需求3:实现最短路径查询
以 -b 参数加两个地铁站点名称分别作为出发与目的,将结果写入 routine.txt,例如:

subway.exe -b 洪湖里 复兴路 -map subway.txt -o routine.txt

具体思路

采用BFS求最短路径,本以为最麻烦的是BFS,后来才发现,数据存储方式,以及换乘站才是最麻烦的部分。

数据存储方式

站点存储格式(Stations中包含所有站点):

public class Station {
    public static HashMap<String, Station> Stations = new HashMap<>();
    private String name;
    private boolean visited =false;
    private Station preStation = null;//just for BFS
    private List<String> lineBelong = new ArrayList<String>();
    private List<String> nearStations = new ArrayList<String>();

    public List<String> getNearStations() {
        return nearStations;
    }
    public void addNearStations(String nearStation) {
        this.nearStations.add(nearStation);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public boolean isVisited() {
        return visited;
    }
    public void setVisited(boolean visited) {
        this.visited = visited;
    }
    public Station getPreStation() {
        return preStation;
    }
    public void setPreStation(Station preStation) {
        this.preStation = preStation;
    }
    public List<String> getLineBelong() {
        return lineBelong;
    }
    public void addLineBelong(String lineBelong) {
        this.lineBelong.add(lineBelong);
    }

}

地铁线存储方式(Lines包含所有地铁线号):

public class Line {
    public static HashMap<String, Line> Lines = new HashMap<>();
    private int id;
    private String name;
    private LinkedList<String> Stations = new LinkedList<>();
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public LinkedList<String> getStations() {
        return Stations;
    }
    public void addStations(String name) {
        this.Stations.add(name);
    }

}

其他数据:

public class Parameter {
     public static String FILE_IN=null;
     public static String FILE_OUT=null;
     public static String START_STATION=null;
     public static String END_STATION=null;
}

首先,使用getSubWayMsg()方法来读取subway.txt中的数据。

public void getSubWayMsg(String filepath) throws Exception {
         try {
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(filepath)),"UTF-8"));
                String getfileline = null;
                int linecount = 1;
                while ((getfileline = bufferedReader.readLine()) != null) {
                    String[] list = getfileline.split(" ");
                    Line line = new Line();
                    line.setId(linecount++);
                    line.setName(list[0]);
                    String perStation="";
                    String nextStation="";
                    for(int i = 1; i < list.length; i++) {
                        if(i == list.length-1) {
                            nextStation="";
                        }else {
                            nextStation=list[i+1];
                        }
                        if(Station.Stations.containsKey(list[i])) {
                            Station.Stations.get(list[i]).addNearStations(perStation);
                            Station.Stations.get(list[i]).addNearStations(nextStation);
                            Station.Stations.get(list[i]).addLineBelong(line.getName());
                            line.addStations(Station.Stations.get(list[i]).getName());
                        }else {
                            Station station = new Station();
                            station.setName(list[i]);
                            station.addLineBelong(line.getName());
                            station.addNearStations(perStation);
                            station.addNearStations(nextStation);
                            Station.Stations.put(station.getName(), station);
                            line.addStations(station.getName());
                        }
                        perStation=list[i];
                    }
                    Line.Lines.put(line.getName(), line);

                }
                bufferedReader.close();
            } catch (Exception e) {
                System.err.println("error: " + e);
            }
            return ;
    }

指定输出某条地铁线:


    public String getLines(String lineName) {
        try {
            Line line = Line.Lines.get(lineName);
            String lineMsg=line.getName()+":";
            for(String name : line.getStations()) {
                lineMsg = lineMsg + "->" + name;
            }
            return lineMsg;
        }catch(Exception e) {
        }
        return null;

    }

BFS算法求最短路径:

public void BFS(String st,String ed) {
        for (Station s : Station.Stations.values()) {
            s.setVisited(false);
        }
        Queue<String> queue = new LinkedList<>();
        queue.add(st);
        while(!queue.isEmpty()) {
            String w =queue.poll();
            if(w == ed) {
                break;
            }
            for(String sName : Station.Stations.get(w).getNearStations()) {
                if(sName.equals("")) {
                    continue;
                }
                Station s = Station.Stations.get(sName);
                while(!s.isVisited()) {
                    s.setPreStation(Station.Stations.get(w));
                    s.setVisited(true);
                    queue.add(s.getName());
                }

            }
        }
    }

根据bfs中的pre(保存在station中)列出最短路径:

    public List<String> getBestWayMsg() {
        Station s = Station.Stations.get(Parameter.END_STATION);
        List<String> way = new ArrayList<String>();
        while(!s.getName().equals(Parameter.START_STATION)) {
            way.add(s.getName());
            s = s.getPreStation();
        }
        Collections.reverse(way);
        return way;
    }
}

Mian函数功能实现:

public static void main(String[] args) throws Exception{
        boolean isMap = false;
        boolean isGetline = false;
        boolean isPutmsg = false;
        boolean isCheck = false;
        String line ="";
        for(int i = 0; i < args.length; i++){

            if(args[i].equals("-map")) {
                Parameter.FILE_IN = args[++i];
                isMap =true;
            }
            else if(args[i].equals("-a")) {
                line = args[++i];
                isGetline =true;
            }
            else if(args[i].equals("-o")) {
                Parameter.FILE_OUT = args[++i];
                isPutmsg =true;
            }
            else if(args[i].equals("-b")) {
                Parameter.START_STATION = args[++i];
                Parameter.END_STATION = args[++i];
                isCheck =true;
            }
            else {
                System.err.print(args[i]);
                System.err.print("erro:"+"请输入正确的命令。");
            }
        }
        if(isMap) {
            Getmsg getmsg = new Getmsg();
            getmsg.getSubWayMsg(Parameter.FILE_IN);
            System.out.println("读取"+Parameter.FILE_IN+"的信息成功");
//          for (Line lie : Line.Lines.values()) {
//              System.out.println(lie.getName()+":");
//              for(String name : lie.getStations()) {
//                  System.out.print(" "+name);
//              }
//              System.out.println();
//          }
        }
        if(isMap&&isGetline&&isPutmsg) {
            Getmsg getmsg = new Getmsg();
            String l = getmsg.getLines(line);
//          System.out.print(l);
            try {
                FileWriter fileWriter = new FileWriter(Parameter.FILE_OUT);
                fileWriter.write(l);
                fileWriter.flush();
                fileWriter.close();
            } catch (Exception e) {
                System.err.println("error: "+e);
            }

        }
        if(isMap&&isCheck&&isPutmsg) {
            if(Station.Stations.get(Parameter.START_STATION)==null||
                    Station.Stations.get(Parameter.END_STATION)==null) {
                throw new Exception("Error:输入的地铁站有误");
            }
            Getmsg getmsg = new Getmsg();
            getmsg.BFS(Parameter.START_STATION,Parameter.END_STATION);
            List<String> bestWay = getmsg.getBestWayMsg();
             try {
                    FileWriter fileWriter = new FileWriter(Parameter.FILE_OUT);
                    fileWriter.write("总共有(站):");
                    fileWriter.write(bestWay.size() + "\r\n");
                    String NowLine = Station.Stations.get(bestWay.get(0)).getLineBelong().get(0);
                    fileWriter.write(Parameter.START_STATION);
                    for(int i = 0; i < bestWay.size(); i++) {
                        if(Station.Stations.get(bestWay.get(i)).getLineBelong().contains(NowLine)) {
                            fileWriter.write("->" + bestWay.get(i));
                        }
                        else {
                            System.out.println(NowLine);
                            System.out.println(Station.Stations.get(bestWay.get(i)).getLineBelong());

                            fileWriter.write("->" + bestWay.get(i));
                            for(int j = i+1;j< bestWay.size(); j++) {
                                if(Station.Stations.get(bestWay.get(j)).getLineBelong().size()==1){
                                    fileWriter.write("("+NowLine+"转");
                                    NowLine = Station.Stations.get(bestWay.get(j)).getLineBelong().get(0);
                                    fileWriter.write(NowLine+")");
                                    break;
                                }
                                if(Station.Stations.get(bestWay.get(j)).equals(Parameter.END_STATION)) {
                                    break;
                                }
                            }

                        }

                    }
                    fileWriter.flush();
                    fileWriter.close();
             }catch (Exception e) {
                    e.printStackTrace();
             }
        }

    }

因为在实际编程中,原计划的文件存储方案不易编写,故数据存储方案稍有改变。

测试效果:

-map subway.txt(从控制台打印Lines,line,Stations,Station):

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

-b 鼓楼大街 后沙峪 -map subway.txt -o routine.txt

原文地址:https://www.cnblogs.com/tutulei/p/11675192.html

时间: 2024-11-07 15:55:01

北京地铁出行路径规划的相关文章

北京地铁出行线路规划——代码实现

项目概述 根据输入的出发站和终点站推荐最短路线,显示搭乘线路及经过站点 采用Dijkstra算法,采用HashMap作为主要数据存取结构 运行结果:       代码分析  txt文件用空格分隔,先存储在LinkedHashSet中 public class Data { public static LinkedHashSet<List<Station>> lineSet = new LinkedHashSet<>();//List<Station>集合 p

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

项目地址 详见: 一.基本功能 获取地铁线路图. 以参数 -map 作为标志,来获得对应的自定义地铁线路图信息文件(命名为 Subway.txt).输入格式如: java Subway -map Subway.txt 获取指定地铁线路. 以参数 -a 作为标志,并输入指定地铁线路,输出的文件以参数 -o 来指定.从线路的起始站点开始,依次输出该地铁线经过的所有站点,直到终点站.输入格式如: java Subway -a 1号线 -map Subway.txt -o Station.txt 输入起

北京地铁出行线路规划

参考 https://www.cnblogs.com/myp123/p/11669391.html https://www.cnblogs.com/xupppp/p/11663525.html 项目介绍 规划 https://www.cnblogs.com/RittLiii/p/11570168.html Github 实现语言 java 主要算法 Dijkstra 类 Main 程序入口,进行输入操作,判断输入 Station model类,储存站点信息 Routine model类,储存地铁

北京地铁出行路线规划设计

一.需求分析 根据题意,需要做到以下几点: 1.可以判断命令行输入的参数并执行相应的操作 2.可以读入地图信息 3.用户可以读取某一地铁线路从起始站到终点站的全部信息 4.用户写入起始站和终点站,规划出正确的路线并告知用户路线 5.能对于用户的不正确输入加以判断并提示 二.设计思路 1.考虑到每个站点会有很多属性,故采用java类的形式进行编程 2.要寻找最短路径问题,则采用dijkstra算法 3.给每条线路id方便运算 三.预计的具体实现(可能后续会作修改)   1.地图导入格式:用文本文件

地铁出行线路规划

地铁出行线路规划 github: 31701022 需求分析 1.确定地铁站信息存储的文件格式 2.设计文件的读取与写入命令行 3.能够输出从起点到终点的所有站点 4.能够找出经过最少站数的路径 5.通过用例测试和性能检查 设计思路 本次设计主要是两个要点,一是确定文件格式,二是找出最优路径,即经过最少站数的路径. 首先为了输入方便采用简单的文件输入方式,输入格式上按照每一条线路上的每一个站点排序,可换乘的站点添加标注: 一号线:刘圆,西横堤,...,西站(6),... 二号线:曹庄,卞兴,..

结对项目—地铁出行路线规划

结对项目—地铁出行路线规划 我的搭档:陈鸿超 14061216 https://github.com/ChengFR/PairProgramming_SubwayRoute- 会在十一期间发布新版本 结对编程体会: 结对编程的优点: 站在软件开发的角度,两个人共同面对同一台电脑进行开发,无论是效率还是软件质量都要超过一个人进行开发的情况. 对于还处于学习阶段的年轻软件开发者来说,结对编程是一个很好的互相学习的机会 结对编程时动力.责任感更强 结对编程的缺点: 对于我们来说,寻找两个人共同的时间进

天津地铁出行线路规划项目需求分析与设计思路分析

天津地铁出行线路规划项目需求分析与设计思路分析 项目概要 以下是天津地铁线路总图,本项目的受众可以通过本软件,获得天津市地铁出行最便捷,最快速的线路推荐. 需求分析 实现一个帮助进行地铁出行路线规划的命令行程序. 支持地铁线路的更改,站点更改.取消与添加,以及线路的局部封闭. 支持查询线路的所有站点. 支持查询到某终止站点的途径最少站点的路线. 数据存储结构分析 由于单一的线路表与站点表是无法表示如此复杂的地铁线路情况的. 有多个前驱的站点如:,以及有多个后继的站点如:,这种情况无法只通过这两个

北京地铁最短线路规划

一.项目需求 设计一个能进行北京地铁最短线路规划的程序. 二.文件存储 用一个名为data.txt的文件来存储所有北京地铁线路及站点信息,如下所示. 三.算法代码 本次项目的设计用到的语言是java语言,主要的规划最短路径的算法采用dijkstra算法 public class PathControl { private static List<Station> analysisList = new ArrayList<>(); private static HashMap<

北京地铁出行规划

一.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 起