北京地铁规划项目总结
作者:互联网
一、项目介绍
GitHub链接:https://github.com/Magazinediver/Subway
核心算法:Dijkstra算法
编写语言:Java
需求分析:
1.subway.txt导入地铁线路信息,routine.txt输出地铁线路信息
2.对地铁行程规划(最短路径查询),并输出
3.输出地铁信息 1线路信息2站点信息
二、文件导入方式设计
2.1导入文本txt格式
24 //线路总数 1 //线路编号 23 //线路中站点数目 一号线 //线路名 一号线 苹果园 否 //格式: 线路名 站点名 是否换乘,若换乘则列出站点名 一号线 古城 否 一号线 八角游乐园 否 一号线 八宝山 否 一号线 玉泉路 否 一号线 五棵松 否 一号线 万寿路 否 一号线 公主坟 十号线 一号线 军事博物馆 九号线 一号线 木樨地 否 一号线 南礼士路 否 一号线 复兴门 二号线 一号线 西单 四号线 ......
2.2 java文件导入设计
1.导入时先按照文档中第一个数字,即线路总数x,建立for循环,获取有x条线路的line_list
2.再按照每条线路的第一行的数字,获取线路id
3.利用每条线路中的第二行,取得每条线路中的站点总数y,建立for循环,获取有y个站点的station_list,即每条线路中的站点列表
4.利用每条线路中的第三行,取得每条线路中的站点中文名称
5.后面即是地铁站点的输入格式:线路名 站点名 是否换乘,若换乘则列出站点名
其中先按空格分开一行,存入String s[] ,s[0]所属线路,s[1]站点名,s[2]是否有换乘,若S[2]不是“否“(非换乘站),就将S[2]按照“,”分离,存入String s1[],即trans_list
2.3java文件导入概念图
2.4java文件导入代码实现
while((str=bufferedReader.readLine())!=null) { if(str.equals(String.valueOf(j)))// { Line a = new Line(); int k = Integer.parseInt(bufferedReader.readLine());// a.setLname(bufferedReader.readLine()); for(int h=0;h<k;h++) { Station b = new Station(); if((str1=bufferedReader.readLine())!=null) { String[] s = str1.split(" "); b.setLine(s[0]); b.setSname(s[1]); if(!s[2].equals("否")) { String[] s1 = s[2].split(","); b.setStationrans(s1); u=0; for(int p=0;p<kb.length;p++) { if(kb[p].equals(b.getSname())) { u=1; } } if(u!=1) { kb[t] = b.getSname(); t++; } } } a.setStation(b); } list.add(a); j++; } return list; }
三、存储结构设计
3.1.无向图站点结构设计
1.station作为node
2.每个node之间有边连接,默认权值99,若是两站链接则权值设为1
3.可获得node再无向图中的序号
4.可对图中node计数
5.设计无向图的邻接矩阵结构
public static List<Line> mainlist = new ArrayList<Line>(); //线路list protected int[][] subTrainMatrix; // 邻接矩阵 private static final int MAX_WEIGHT = 99; // 初始各node间距离99 private int[] dist; //node间距离存储数组 private List<Station> vertex = new ArrayList<Station>(); // node private List<Edge> edges; //node间距离结构 //各个方法 public int[][] getSubTrainMatrix() //get邻接矩阵 public void setVertex(List<Station> vertices) //set node public List<Station> getVertex() //get node public List<Edge> getEdges() //get边 public int getVertexSize() //图中node数 public int vertexCount() //node编号 public String toString() public subway(int size) public subway(List<Station> vertices)
3.2无向图边结构设计
class Edge { private T start, dest; //起始站,目标站 private int weight; //边权值 public Edge() public Edge(T start, T dest, int weight) public String toString() }
3.3站点结构
public class Station { public String sname; //站点名 String[] trans = new String[3]; //换乘线路存储数组 public String line; //所属线路名 public void setSname(String sname) //set站点名 public String[] getStationrans() //get站点换乘线路列表 public void setStationrans(String[] trans) //set站点换乘线路列表 public String getLine() //get所属线路名 public void setLine(String line) //set所属线路名 public String getSname() //get所属站点名 }
3.4线路结构
public class Line { public String lname; //线路名 public List<Station> station = new ArrayList<Station>();//站点列表 public List<Station> getStation() //get站点列表 public void setStation(Station station) //set站点列表 public String getLname() //get线路名 public void setLname(String lname) //set站点名 }
四、线路及线路站点输出设计
4.1站点输出要求
1.能显示站点所属线路
2.能体现出换乘
3.能体现路线所经过的站点数
public static void printstation()//站点输出 { for(int i=0;i<mainlist.size();i++) { if(mainlist.get(i).getLname().equals(lname)) { System.out.println(mainlist.get(i).getLname()); for(int j=0;j<mainlist.get(i).getStation().size();j++) { System.out.print(mainlist.get(i).getStation().get(j).getSname()+" "); for(int k=0;k<mainlist.get(i).getStation().get(j).getStationrans().length;k++) { System.out.println(mainlist.get(i).getStation().get(j).getStationrans()[k]); } } } } } public static void printline(String lname)//线路输出与站点输出同理
4.2输入输出设计
4.2.1输入设计
输入格式
1.获取地铁线路信息
java subway -map subway.txt
2.输出地铁特定线路信息
java subway -a 1号线 -map subway.txt -o station.txt
3.输出地铁线路规划信息
java subway.subway -b 古城 T2航站楼 -map subway.txt -o routine.txt
4.输入读取代码
-map 参数来获得对应的自定义地铁文件
-a 指定了用户希望查询的地铁线路
-o 指定输出文件
-b 指定出发站与目标站
if(args.length==0) System.out.println(""); for(int i=0;i<args.length;i++) { if(args[i].equals("-map")) { flag1=1; flag2=1; if(args.length<i+2) { System.out.println(""); return; } mainlist =Input.getFileContext(args[i+1]); }else if(args[i].equals("-a")) { flag1=1; operate="-a"; if(args.length<i+2) { System.out.println("格式不正确"); return; } route=args[i+1]; }else if(args[i].equals("-b")) { flag1=1; operate="-b"; if(args.length<i+3) { System.out.println("格式不正确"); return; } start=args[i+1]; stop=args[i+2]; }else if(args[i].equals("-o")) { flag1=1; output=args[i+1]; } } if(flag1==0) { System.out.println("格式不正确"); return; } else if(flag2==0) { System.out.println("格式不正确"); return; } if(operate==null&&output!=null) { System.out.println("格式不正确"); return; } else if(operate!=null&&output!=null) { if(operate.equals("-a")) { try { if(outPutRoute(route, output)==false) { System.out.println("没有输出,没有此线路"); return; } } catch (FileNotFoundException e) { e.printStackTrace(); } }else if(operate.equals("-b")) { if(start.equals(stop)) { System.out.println("出发站与到达站不能相同!!!!!"); return; } if(Mainoutput(start, stop, output)==false) { System.out.println("没有输出,无法到达"); return; } } } }
4.2.2输出设计
输出中的站点会携带所属线路
两个站点间会用->连接
最后会输出经过的站点数
控制台中输出
文件输出设计
标签:总结,站点,北京地铁,String,int,线路,一号线,规划,public 来源: https://www.cnblogs.com/ximate/p/11656105.html