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

项目概述

根据输入的出发站和终点站推荐最短路线,显示搭乘线路及经过站点

采用Dijkstra算法,采用HashMap作为主要数据存取结构

运行结果:

     

代码分析 

txt文件用空格分隔,先存储在LinkedHashSet中

public class Data {

public static LinkedHashSet<List<Station>> lineSet = new LinkedHashSet<>();//List<Station>集合

public static void TxttoData(String filePath) {
try {
File file = new File(filePath);

if (file.isFile() && file.exists()) { // 判断文件是否存在

FileInputStream fis = new FileInputStream(file);
InputStreamReader read = new InputStreamReader(fis, "GBK");
BufferedReader br = new BufferedReader(read);

String ttxt = null;
while ((ttxt = br.readLine()) != null) {//br.readLine()每执行一次向下读一行

List<Station> Linelist = new ArrayList<Station>();

String[] line = ttxt.split(" ");//分隔符

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

Linelist.add(new Station(line[0],line[i]));//Station:线路名,站名

}
lineSet.add(Linelist);
}
read.close();
} else {
System.out.println("文件不存在");
}
} catch (Exception e) {
System.out.println("读取错误");
e.printStackTrace();
}

}
public static Station toStation(String station) {
for(List<Station> ls:Data.lineSet)
for(Station st:ls)
if(station.equals(st.getname()))
return st;
return null;
}

}

将数据用Dijkstra算法计算出路径并存入Map中

public static Line set(Station start,Station over) {

if (!liststation.contains(start)) {//起点站加入list
liststation.add(start);
}

if (start.equals(over)){//起点=终点
Line result = new Line(start, over, 0);

resultMap.put(start, result);//存入HashMap

return resultMap.get(start);
}
if (resultMap.isEmpty()) {//第一站
List<Station> linkStations = getLinkStation(start);//获取相邻站

for (Station station : linkStations) {//遍历
Line result = new Line();
result.setStart(start);
result.setOver(station);
int distance = 1;
result.setDistance(distance);
result.getPass().add(station);
resultMap.put(station, result);
}
}
Station next = getNextStation();
if (next==null){
Line result = new Line();
result.setDistance(0);
result.setStart(start);
result.setOver(over);
return resultMap.put(over, result);
}
if (next.equals(over)) {//找到终点
return resultMap.get(next);
}
List<Station> nextLink = getLinkStation(next);
for (Station after : nextLink) {
if (liststation.contains(after)) {
continue;
}
int distance = resultMap.get(next).getDistance()+1;
if( next.getname().equals(after.getname())){
distance = 0;
}
List<Station> beforePass = resultMap.get(next).getPass();
Line afterResult = resultMap.get(after);
if (afterResult!=null){
if (afterResult.getDistance() > distance) {
afterResult.setDistance(distance);
afterResult.getPass().clear();
afterResult.getPass().addAll(beforePass);
afterResult.getPass().add(after);
}
}
else {
afterResult = new Line();
afterResult.setDistance(distance);
afterResult.setStart(start);
afterResult.setOver(after);
afterResult.getPass().addAll(beforePass);
afterResult.getPass().add(after);
}
resultMap.put(after, afterResult);
}
liststation.add(next);
set(start, over);
return resultMap.get(over);
}

UI 手动输入站点,程序下方进行输出

public class Mainui extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;

private JPanel jp2 = new JPanel();

private JButton search = new JButton("查询");
private JLabel start = new JLabel("起始站:");
private JLabel end = new JLabel("终点站:");
private JTextField starttxt = new JTextField(30);
private JTextField endtxt = new JTextField(30);

public Mainui() {
super( "北京地铁出行规划系统");

jp2.add(start);
jp2.add(starttxt);
jp2.add(end);
jp2.add(endtxt);
jp2.add(search);

this.add(jp2,BorderLayout.CENTER);

this.setSize(400, 150);

// 屏幕居中显示
double width = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
double height = Toolkit.getDefaultToolkit().getScreenSize().getHeight();
this.setLocation((int) (width - this.getWidth()) / 2,
(int) (height - this.getHeight()) / 2);

this.validate();

search.addActionListener(this);

this.setVisible(true);

this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}

public void actionPerformed(ActionEvent e) {
if(e.getSource()==this.search) {
LineOut lo = new LineOut();

System.out.println((lo.LineOut(Data.toStation((String)starttxt.getText()),Data.toStation((String)endtxt.getText()))));
}
}
}

txt文件格式

GitHub地址 :https://github.com/caiweiwen/learning/tree/master/subway

原文地址:https://www.cnblogs.com/cwwaxx/p/11674894.html

时间: 2024-09-27 06:32:09

北京地铁出行线路规划——代码实现的相关文章

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

项目地址 详见: 一.基本功能 获取地铁线路图. 以参数 -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类,储存地铁

北京地铁最短线路规划

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

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

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

地铁出行线路规划

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

地铁出行线路规划项目设计

一.项目理解 1.设计需求:地铁出行下路规划的命令行程序(最短路径) 2.设计工具:JAVA Eclipse编译器 3.数据处理:数据写入文本导入程序,将陷入储存于不同文本文件 4.程序测试:足够的测试样例(10条)来保证程序的正确运行 5.程序输入:需要输入1.进站 2.出站 6:设计语言:java 二.文本格式设计        1.文本的输入将采用json格式 1 { 2 "line1": [ 3 { 4 "station1": "苹果园站"

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

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

北京地铁出行路径规划

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

北京地铁出行规划

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