北京地铁项目

北京地铁项目

github:https://github.com/leo-xlz/Subway-beijing

模块分析-----

zucc.edu.cn.model

存放站点信息和路径信息
station.java

    private String name;//站点名字

    private String line;//所属路线

    private List<Station> linkStations = new ArrayList<>();//相邻连接站点

routine.java
· private Station star;//起点 private Station end;//终点 private int distance; private List<Station> path=new ArrayList<>();
### main 调用函数并且运行
main.java
```·
public static void main(String[] args) throws UnsupportedEncodingException {
switch (args[0]) {
//读入subway.txt文件数据
case "-map":
//-map subway.txt
if (args.length == 2) {
FileOperate.Readfile = System.getProperty("user.dir") + File.separator + args[1];
//根据路径,读取地铁信息,并打印。
FileOperate.getFile();
System.out.println("成功读取subway.txt文件");
} else {
System.out.println("验证参数格式!");
}
break;
//查询指定线路的文件数据,并写入到station.txt文件中
case "-a":
//-a 1号线 -map subway.txt -o station.txt

            if (args.length == 6) {
                FileOperate.Readfile = System.getProperty("user.dir") + File.separator + args[3];
                FileOperate.Writefile = System.getProperty("user.dir") + File.separator + args[5];

                FileOperate.getFile();
                System.out.println(args[1]);
                if (FileOperate.Map.keySet().contains(args[1])) {
                    FileOperate.loadLine(args[1]);
                    System.out.println("已将地铁" + args[1] + "的各站点信息写入station.txt文件");
                } else {
                    System.out.println("线路不存在");
                }
            } else {

                System.out.println("验证参数格式!");
            }
            break;
        //查询指定站点之间的最短路径信息
        case "-b":
            //-b 天安门西 北京大学东门 -map subway.txt -o routine.txt
            System.out.println(1);
            if (args.length == 7) {
                FileOperate.Readfile = System.getProperty("user.dir") + File.separator + args[4];
                FileOperate.Writefile = System.getProperty("user.dir") + File.separator + args[6];
                FileOperate.getFile();
                FileOperate.shorestPath(args[1],args[2]);
                System.out.println("已将" + args[1] + "到" + args[2] + "最短路径的结果写入routine. txt文件");

            } else {
                System.out.println("验证参数格式!");
            }
            break;
        default:
            System.out.println("验证参数格式!");
    }
}

### zucc.edu.cn.manager Dijkstra.java 最短路径算法·
public static HashMap<Station, Routine> resultMap = new HashMap<>();//结果集
public static List list = new ArrayList<>();//分析过的站点

public static Routine dijkstra(Station star, Station end) {

    if (!list.contains(star))
        list.add(star);
    if (star.equals(end)) {//如果起始点和终点相同,直接返回
        Routine result = new Routine();

        result.setDistance(0);
        result.setEnd(star);
        result.setStar(star);
        resultMap.put(star, result);
        return resultMap.get(star);··
    }
    if (resultMap.isEmpty()) {
        List<Station> linkedStation = getLinkStations(star);
        for (Station station : linkedStation) {
            Routine routine = new Routine();
            routine.setStar(star);
            routine.setEnd(station);
            routine.setDistance(1);
            routine.getPath().add(station);
            resultMap.put(station, routine);
        }
    }
    Station next = getNextStation();
    if (next == null) {
        Routine routine = new Routine();
        routine.setDistance(0);
        routine.setStar(star);
        routine.setEnd(end);
        return resultMap.put(end, routine);
    }
    //如果得到的最佳邻接点与终点相同,则直接返回结果集
    if (next.equals(end))
        return resultMap.get(next);

    List<Station> bestlinkStation = getLinkStations(next);
    for (Station best : bestlinkStation) {
        if (list.contains(best))
            continue;
        int distance =0;

        if (next.getName().equals(best.getName()))
            distance = 0;
        distance = resultMap.get(next).getDistance() + 1;

        List<Station> nextPass = resultMap.get(next).getPath();
        Routine res = resultMap.get(best);
        if (res != null) {
            if (res.getDistance() > distance) {
                res.setDistance(distance);
                res.getPath().clear();
                res.getPath().addAll(nextPass);
                res.getPath().add(best);
            }
        } else {
            res = new Routine();
            res.setDistance(distance);
            res.setStar(star);
            res.setEnd(best);
            res.getPath().addAll(nextPass);
            res.getPath().add(best);
        }
        resultMap.put(best, res);
    }
    list.add(next);

    return dijkstra(star, end);

}

//通过计算最小权值 计算下一个需要分析的点
private static Station getNextStation() {
    int min = 1000;
    Station rets = null;
    Set<Station> stations = resultMap.keySet();
    for (Station station : stations) {
        if (list.contains(station)) {
            continue;
        }
        Routine result = resultMap.get(station);
        if (result.getDistance() < min) {
            min = result.getDistance();
            rets = result.getEnd();
        }
    }
    return rets;
}

```

  • FileOperate.java 文件处
    读取文件,通过 HashMap<String,List> Map来存放地铁线路信息
    public static String Readfile;
    public static String Writefile;
    public static HashMap<String,List<Station>> Map=new HashMap<>();//存放地铁线路信息
    public  static HashSet<List<Station>> lineSet=new LinkedHashSet<>();//所有线路的集合
    public static void getFile() {

        File file=new File(Readfile);

        BufferedReader rd=null;
        /* 读取数据 */
        try {
            InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(file),"UTF-8");
            rd=new BufferedReader(inputStreamReader);
            String lineTxt = null;
            while ((lineTxt = rd.readLine()) != null) {
                String[] s = lineTxt.split(" ");//创建一个临时存放数据的数组
                List<Station>  Stations = new ArrayList<>();
                for(int i = 1;i<s.length;i++){     //将读入的站点并加入到对应线路的List中
                    Station station = new Station(s[i],s[0]);
                    Stations.add(station);
                }
                lineSet.add(Stations);
                Map.put(s[0],Stations);
            }
            rd.close();
        } catch (UnsupportedEncodingException e) {  //异常处理
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }catch (IOException e) {
            e.printStackTrace();
        } finally {
        }
        }
    public static void loadLine(String Line){ //根据指定的路线输出此路线的所有站点
        File file=new File(Writefile);
        List<Station> line;
        BufferedWriter bw = null;
        try {
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");
            bw = new BufferedWriter(outputStreamWriter);
            line=Map.get(Line);
            bw.write(Line+"\n");
            bw.write("--------\n");
            bw.write("--------\n");

            for(int i=0;i<line.size();i++)
                    bw.write(line.get(i).getName()+"\r\n");//写入指定路线的站点信息
            bw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static  String getLineName(Station station){//根据站点名称得到线路名称
        String sName=station.getName();
        for(Map.Entry<String,List<Station>>entry:Map.entrySet()){
            List<Station> stations=entry.getValue();
            for(Station s:stations){
                if(s.getName().equals(sName))
                    return entry.getKey();
            }
        }
        return  null;
    }

    public static void shorestPath(String star,String end){
        File file = new File(Writefile);
        BufferedWriter bw = null;

        try{
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");
            bw = new BufferedWriter(outputStreamWriter);

            Routine routine=Dijkstra.dijkstra(new Station(star),new Station(end));

            bw.write((routine.getPath().size()+1)+"\r\n");
            String lineName=getLineName(routine.getStar());
            bw.write(lineName+"\n");
            bw.write(routine.getStar().getName()+"\n");
            for(int i=0;i<routine.getPath().size()-1;i++) {
                bw.write(routine.getPath().get(i).getName()+"\n");
                if(!routine.getPath().get(i+1).getLine().equals(routine.getPath().get(i).getLine())){
                    bw.write("---需换乘"+routine.getPath().get(i+1).getLine()+"---\n");
                }
            }
            bw.write(routine.getEnd().getName()+"\n");
            bw.close();

        }catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

## 测试
1.程序启动时需要通过读取 -map 参数来获得对应的自定义地铁文件(命名为 subway.txt),从而得到地铁线路图的信息。

java subway -map subway.txt


2.给定路线,输出此路线上所有站点,保存信息到station.txt

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


3.给出两个站点,输出两点间的最短路径,保存文件到routine.txt

subway.exe -b 香山 焦化厂 -map subway.txt -o routine.txt

原文地址:https://www.cnblogs.com/Leo-X/p/11674540.html

时间: 2024-11-02 00:53:00

北京地铁项目的相关文章

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

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

北京地铁规划项目总结

一.项目介绍 实现一个帮助进行地铁出行路线规划的命令行程序. github链接:https://github.com/blakeyoungc/subway 主要需求:1.地铁线路图信息的导入     2.查询指定地铁线经过的站点 3.计算从出发到目的站点之间的最短(经过的站点数最少)路线,并输出经过的站点的个数和路径(包括出发与目的站点). 采用https://map.bjsubway.com/上的北京地铁线路图:  二.需求实现 主要模块介绍: 序号 模块名 功能 对应java类 1 主模块(

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

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

涨姿势!北京地铁原来是16条旅游专线

学姐按:周末想带孩子玩,又没太多时间.好不容易有时间出去了,结果半天都被堵在了路上,这让很多家长每逢周末必发愁.为什么不换种方式出行呢?北京的地铁的里程越来越长,殊不知所经之处有很多的大小景点可以玩.今天学姐就带大家细数那些地铁沿线的美景. 一号线 八角游乐园站 石景山游乐园 票价:门票10元,游乐项目另收费 地址:石景山区石景山路 玉泉路站 北京国际雕塑公园 票价:旺季10元,淡季5元 地址:石景山区石景山路2号 军事博物馆站 中华世纪坛 票价:免费 地址:海淀区复兴路甲9号(中央电视台与军事

北京地铁线路规划

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

北京地铁最短路径实现

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

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

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

北京地铁线路规划系统

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

北京地铁最短线路规划

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