个人项目——地铁最短路径

项目介绍

主要功能

提供一副地铁线路图,计算指定两站之间最短(最少经过站数)乘车路线;输出指定地铁线路的所有站点。以北京地铁为例,地铁线路信息保存在data.txt中,格式如下:

地铁线路总数

线路名1站名1站名2站名3...

线路名2站名1站名2站名3...

线路名3站名1站名2站名3......

1、问题需求

程序能正确处理输入的命令行、

程序能正确输出指定地铁线经过的站点

程序能正确输出两个站点间的最短路径

2、实现语言

java

3、实现算法

Dijkstra

4、类职责划分

Station.java

储存站信息

Subway.java

Main函数

MyMap.java

储存map信息

Line.java

储存线路信息

5、核心代码

读入txt

public static void readText(String fileName) throws IOException {

File file = new File(fileName);

InputStreamReader reader = new InputStreamReader(

new FileInputStream(file));

BufferedReader br = new BufferedReader(reader);

String content = null;

content = br.readLine();

while (content != null) {

String[] contents=content.split(",");

Line line = new Line();

line.setLineName(contents[0]);

Station station = null;

for (int i = 1; i < contents.length; i++) {

if(!MyMap.stationMap.containsKey(contents[i])) {

station = new Station();

station.setStationName(contents[i]);

}

station = MyMap.myMap.getStation(contents[i]);

station.setLine(line);

line.addStation(station);

if(i!=1) {

station.addPreStation(line.getStation(i-2));

line.getStation(i-2).addPostStation(station);

}

else {

station.addPreStation(null);

}

if(i==contents.length-1) {

station.addPostStation(null);

}

}

content = br.readLine(); // 一次读入一行数据

}

br.close();

}

输出线路的站点信息

public static void printStationList(String lineName, String fileName) throws IOException {

File writename = new File(fileName); // 相对路径

writename.createNewFile(); // 创建新文件

BufferedWriter out = new BufferedWriter(new FileWriter(writename));

Line line = MyMap.myMap.getLine(lineName);

System.out.println(lineName+":");

out.write(lineName+"\r\n"); // \r\n为换行

out.flush(); // 把缓存区内容压入文件

for (Station station : line.getStationList()) {

System.out.println(station.getStationName());

out.write(station.getStationName()+"\r\n"); // \r\n为换行

out.flush(); // 把缓存区内容压入文件

}

out.close();

}

输出最短路径

public static void printShortestLine(String startStation, String endStation, String fileName) throws IOException {

File writename = new File(fileName); // 相对路径

writename.createNewFile(); // 创建新文件

BufferedWriter out = new BufferedWriter(new FileWriter(writename));

Station start = MyMap.myMap.getStation(startStation);

Station end = MyMap.myMap.getStation(endStation);

bfs(start,end);

Stack stationStack = new Stack();

Stack lineStack = new Stack();

Station cur=end;

while(cur!=null) {

stationStack.push(cur);

List line = new ArrayList();

line.addAll(cur.getLineList());//list拷贝

//System.out.println(cur.getStationName());

//System.out.println(cur.getParent().getStationName());

cur = cur.getParent();

if(cur==null)

break;

line.retainAll(cur.getLineList());//取交集

lineStack.push(line.get(0));//默认交集只有一个

}

Line preLine = lineStack.peek();

Line curLine = null;

while(!stationStack.isEmpty()) {

Station station = stationStack.pop();

out.write(station.getStationName()+" "); // \r\n为换行

out.flush(); // 把缓存区内容压入文件

System.out.print(station.getStationName());

if(!lineStack.empty()) {

curLine = lineStack.pop();

if(curLine!=preLine) {

System.out.print(curLine.getLineName());

out.write(curLine.getLineName()); // \r\n为换行

out.flush(); // 把缓存区内容压入文件

}

preLine = curLine;

}

out.write("\r\n"); // \r\n为换行

out.flush(); // 把缓存区内容压入文件

System.out.print("\n");

}

out.close();

}

Station类

private String stationName;

private List lineList;

private List preStation;

private List postStation;

private Station parent;

Line类

private String lineName;

private List stationList;

MyMap类

public static MyMap myMap = new MyMap();

public static java.util.Map lineMap;

public static java.util.Map stationMap;

bfs广度优先搜索

public static void bfs(Station start, Station end) {

Queue queue = new LinkedList();

queue.add(start);

while(!queue.isEmpty()) {

Station cur = queue.poll();

MyMap.myMap.visited(cur);

if(cur == end)

break;

List list = new ArrayList();

list.addAll(cur.getPreStation());

list.addAll(cur.getPostStation());

for(Station station : list) {

if(station!=null&&!MyMap.myMap.isVisited(station)) {

station.setParent(cur);

queue.add(station);

}

}

}

}

6、测试用例

一条线路起始到另外一条线路终点

-b 香山 焦化厂 -map 地铁线路信息.txt -o shortest.txt

香山

植物园

万安

茶棚

颐和园西门

巴沟10号线

苏州街

海淀黄庄4号线大兴线

人民大学

魏公村

国家图书馆

动物园

西直门2号线

积水潭

鼓楼大街

安定门

雍和宫

东直门

东四十条

朝阳门6号线

东大桥

呼家楼

金台路14号线东段

大望路

九龙山7号线

大郊亭

百子湾

化工

南楼梓庄

欢乐谷景区

双合

焦化厂

输入命令有误

-b 香山 -map 地铁线路信息.txt -o shortest.txt

错误命令!

正确命令格式:

导入站点信息:java subway -map subway.txt

查询线路信息:java subway -a 1号线 -map subway.txt -o station.txt

查询站点间最短路程:java subway -b 站点1 站点2 -map subway.txt -o routine.txt

7、总结

Dijkstra还是不太熟悉,使用起来有些困难

标签:Station,cur,地铁,路径,最短,station,new,line,out

来源: https://www.cnblogs.com/zhangzhew/p/13929382.html

java地铁最短,地铁最短路径相关推荐

  1. floyd算法java_利用JAVA和Floyd算法实现上海地铁最短路线搜索系统

    [实例简介] Floyd算法基于JAVA实现上海地铁最短路线搜索系统,图形界面,支持新建删除站点以及新建线路. [实例截图] [核心代码] SUBWAY └── SUBWAY ├── bin │   ...

  2. Java计算机毕业设计地铁舆情管理系统源码+系统+数据库+lw文档

    Java计算机毕业设计地铁舆情管理系统源码+系统+数据库+lw文档 Java计算机毕业设计地铁舆情管理系统源码+系统+数据库+lw文档 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 开 ...

  3. 上海metro app android,一款让你感动到Cry的地铁App | 地铁通-MetroMan #iOS #Android

    地铁出行对于大城市生活的人来说是既舒适又快捷的出行优选之一,不过,错综复杂的地铁线路对很多路盲和城市新人来说却是一个考验.虽然高德.百度地图等都可以线上查询地铁线路,但拥有一款专业实用的.特别是有离线 ...

  4. java地铁最短,世界上最短的地铁 600米长的地铁线路

    地铁是现在城市公共交通的主力,自从世界上第一条地铁诞生之后,得益于在地下运行,不占用地面交通资源的优势,现在各大城市都在修建尽可能长的地铁线路,让城市交通更加便利,但是土耳其的一条地铁线路却是大不一样 ...

  5. java实现北京地铁换乘

    文章目录 项目GitHub地址 文件存放 station.txt 设计思路与模块分析 Station.java DataBuilder.java StationIncludeLineName.java ...

  6. 迪杰斯特拉算法-西安地铁最短路线问题

    文章说明 图是一种较线性表和树更为复杂的数据结构,在各个领域都有着广泛的应用,如城市交通.电路网络分析.交通灯的设置等,其中,最短路径问题的求解是日常生活中最为常见的问题.在现实生活和生产实践中,有许 ...

  7. java计算乘地铁费用_蓝桥杯-地铁换乘

    为解决交通难题,某城市修建了若干条交错的地铁线路,线路名及其所属站名如stations.txt所示. 线1 苹果园 -. 四惠东 线2 西直门 车公庄 -. 建国门 线4 -. 其中第一行数据为地铁线 ...

  8. Java、JSP地铁线路查询系统

    技术:Java.JSP等 摘要: 南京市地铁线路查询系统是城市道路交通的重要组成部分,是城市发展的必然产物,是联系国民生活.社会生产和流通领域的关键环节.南京市地铁线路查询系统的发展一直处于一个较落后 ...

  9. java界面绘制地铁路线_基于 HTML5 Canvas 的交互式地铁线路图

    前言 前两天在 echarts 上寻找灵感的时候,看到了很多有关地图类似的例子,地图定位等等,但是好像就是没有地铁线路图,就自己花了一些时间捣鼓出来了这个交互式地铁线路图的 Demo,地铁线路上的点是 ...

最新文章

  1. Github下载量10万次,最终被所有大厂封杀!
  2. java bean spring_Java+Spring+Bean+注入方式
  3. True Zero Downtime HAProxy Reloads--转载
  4. 动态规划总结与题目分类
  5. C和C++之用extern “C“实现它们之间的互调
  6. 写出TREE-PREDECESSOR的伪代码(算法导论第三版12.2-3)
  7. Java Duration类| isNegative()方法与示例
  8. ARM中断分析之一:中断控制器和CPU、外设的关系
  9. 1261:【例9.5】城市交通路网 《信息学奥赛一本通:动态规划基础》
  10. pytorch 如何使用cuda
  11. 将单链表翻转的两种方法
  12. matlab迭代算法实例_智能优化算法及其MATLAB实例-免疫算法笔记
  13. Layui layui-soul-able 组件 表格列进行拖拽
  14. 麻瓜编程python爬虫微专业_网易微专业麻瓜编程Python Web开发工程师教程
  15. excel打开oracle,Oracle PLSQL读取(解析)Excel文档
  16. 3904三极管是什么功能_想要单片机顺手,搞懂这些三极管知识!
  17. 《Linux管理与应用》课程考核方案
  18. win10运行安卓模拟器蓝屏崩溃
  19. Redis服务器集群搭建
  20. 手把手教处理串口数据

热门文章

  1. Win11系统线程异常未处理怎么办?Win11系统线程异常未处理解决方法
  2. win11更新黑屏无法进入系统怎么办 windows11黑屏更新无法进入系统的解决方法
  3. php diy,PHP DIY 系列------基础篇:1. PSR
  4. mysql数据库工程师考证题_100道MySQL常见面试题总结
  5. 2108. 找出数组中的第一个回文字符串
  6. 2089. 找出数组排序后的目标下标
  7. 快速排序查询第k个数
  8. iView UI常用组件DatePicker清空技巧
  9. vue 引入自定义js方法并调用
  10. Open3d之交互式可视化