北京地铁查询系统
日期:2023.3.17
我负责web端开发,app端由我的队友刘庆岗负责开发。
一.项目概述:
1、数据库设计:
1.1存储:线路号,车站唯一标识ID,线路的各个站名,车站的换乘信息等信息。
1.2需要考虑:如何表示两个小白圆点中间有一条线表示这两个车站是相邻的;这个车站可以转 5 号线等信息。
2、功能设计:
线路查询:输入线路号,输出此地铁线路的所有站名(按某一方向顺序输出即可)。
站点查询:输入站点名称,输出途径该站点的线路名称。
起点-终点查询:输入起点、终点,找到两点之间的最有效线路
起点:知春路 终点:中关村
返回经历的站名的个数,和路径,如果有换乘,请列出换乘的线路
第一阶段-系统功能
1、优化返回两个站点之间最短路径功能:成为一个类,进行单元测试。
2、生成遍历车站类:要求尽可能快地遍历地铁的所有车站呢(只用经过一次,不用下车,就算经过车站)。
例如,注意到13号线 和 10 号线相交的知春路地铁站,选它作为一个起始站,从这个站出发,要经历多少站(换乘不出地铁系统,即不能从一个地铁口走到路面,然后从另一个站进去),才能把所有地铁站都遍历呢?
输入起始站,输出总共经历多少站,以及经历的站名。
3、最少换乘类:要求起点到终点线路换乘次数最少。
二、设计思路和功能点
前端用html和css,后端用mysql数据库,最短路采用迪杰斯特拉算法
功能
线路查询:输入线路号,输出此地铁线路的所有站名(按某一方向顺序输出即可)。
站点查询:输入站点名称,输出途径该站点的线路名称。
起点-终点查询:输入起点、终点,找到两点之间的最有效线路
最短换乘:输入起点、终点,找到两点之间的最少换乘
最短路:输入起点、终点,找到两点之间的最短路径
北京地铁交互图:可以通过可视化显示路线
三、编程总结和分析
通过本次编程,将迪杰斯特拉算法重新复习了一遍,将其应用在了换乘之中。
总的来说,北京地铁查询系统涵盖了许多功能和信息,系统的展示方式也非常直观。同时,我们也对当前开发过程中所遭遇的问题和解决方法进行了总结和记录,希望对其他开发者有所帮助。
四、时间记录日志
| 任务 | 计划用时 | 实际用时 |
|数据库设计|3h|2h|
|算法设计|24h|8h|
|编程后端实现|72h|72h|
|前端界面|48h|24h|
源代码:
package com.itheima.pojo;
public class Station {
private String beginstation;
private String endstation;
public String getBeginstation() {
return beginstation;
}
public void setBeginstation(String beginstation) {
this.beginstation = beginstation;
}
public String getEndstation() {
return endstation;
}
public void setEndstation(String endstation) {
this.endstation = endstation;
}
}
package com.itheima.pojo;
public class Route {
private String id;
private String site;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSite() {
return site;
}
public void setSite(String site) {
this.site = site;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package com.itheima.pojo;
import com.itheima.service.UserService;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class Graphcreate {
public String[] vexs=new String[1000];
public int arcs[][] =new int[500][500];
boolean visited[]=new boolean[500];
UserService userService = new UserService();
private int vexnum=0,arcnum=0;
public Graphcreate creatGraph(Graphcreate graph){
List<Site> sites = userService.selectallsite();
graph.vexnum=sites.size();
System.out.println(vexnum);
for(int i=0;i<sites.size();i++)//依次输入点
{
graph.vexs[i]=sites.get(i).getName();
}
for(int i=0;i<sites.size();i++)
{
for(int j=0;j<sites.size();j++)
{
graph.arcs[i][j]=0;
}
}
List<SiteBeside> besides = userService.select_route_beside();
for(SiteBeside sitebeside:besides){
String sitebeside1 = sitebeside.getSitebeside();
if(sitebeside1.contains(" "))
{
HashSet<String> hashSet=new HashSet<>();
String[] s = sitebeside1.split(" ");
for(String s1:s)
{
if(hashSet.add(s1)){
graph.arcnum++;
int index1 = LocateVex(graph, s1);
int index2 = LocateVex(graph, sitebeside.getSitename());
graph.arcs[index1][index2]=1;
graph.arcs[index2][index1]=1;
}
}
}
else {
graph.arcnum++;
int index1 = LocateVex(graph, sitebeside1);
int index2 = LocateVex(graph, sitebeside.getSitename());
graph.arcs[index1][index2]=1;
graph.arcs[index2][index1]=1;
}
}
// System.out.println(graph.arcnum);
// for(int i=0;i<graph.vexnum;i++)
// {
// for (int j=0;j<graph.vexnum;j++)
// {
// System.out.print(graph.arcs[i][j]+" ");
// }
// System.out.println();
// }
for(int i=0;i<graph.vexnum;i++)
{
visited[i]=false;
}
return graph;
}
public void BFS(Graphcreate graphcreate,int v){
System.out.println(graphcreate.vexs[v]);
visited[LocateVex(graphcreate,vexs[v])]=true;
Queue<String> queue = new LinkedList<String>();
queue.offer(graphcreate.vexs[v]);
while(!queue.isEmpty())
{
String u=queue.poll();
visited[LocateVex(graphcreate,u)]=true;
System.out.println(u);
String w="";
for(int i=0;i<graphcreate.vexnum;i++)
{
if(graphcreate.arcs[LocateVex(graphcreate,u)][i]==1&&!visited[LocateVex(graphcreate,u)])
{
graphcreate.arcs[LocateVex(graphcreate,u)][i]=0;
w=graphcreate.vexs[i];
queue.offer(w);
visited[LocateVex(graphcreate,w)]=true;
}
}
}
}
// String FirstAdjvex(Graphcreate graphcreate,String u)
// {
//
// }
public int LocateVex(Graphcreate graph, String vex){
for(int x=0;x<graph.vexnum;x++)
{
if(graph.getVexs()[x].equals(vex))
{
return x;
}
}
return -1;
}
public String[] getVexs() {
return vexs;
}
public void setVexs(String[] vexs) {
this.vexs = vexs;
}
public int[][] getArcs() {
return arcs;
}
public void setArcs(int[][] arcs) {
this.arcs = arcs;
}
public int getVexnum() {
return vexnum;
}
public void setVexnum(int vexnum) {
this.vexnum = vexnum;
}
public int getArcnum() {
return arcnum;
}
public void setArcnum(int arcnum) {
this.arcnum = arcnum;
}
public static void main(String[] args) {
Graphcreate graph=new Graphcreate();
graph.creatGraph(graph);
}
}