对象:潘攀达
思路:站点有两个属性,编号和站名,一号线的编号是1开头的,二号线的编号是2开头的,以此类推,可以换乘的站点便拥有多个编号。
如果开头数相同,则两个站点在同一条路线不需要换乘,如果开头数不同则要进行换乘。所以获取起始站点的id号与终点站点的id号进行比较,如果他俩有相同的id号那么证明两战点在同一条线路上 则不需要换乘即可到达,如果两个站点没有相同的id号,那么说明不再一条线路上,需要换乘,则搜索终点站所拥有的id号是否有与起始站点id号相同的id号,这里的线路图一个换乘必能到达,所以肯定会有。根据两者的id号之间的联系,进行遍历的输出id号数组,根据id数组查出站名即可。
在获取他们之间站点的id号,通过id号获取站点名字来实现线路信息。
数据库设计:
package Entity;
public class Station {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Station(int id, String name) {
this.id = id ;
this.name = name;
}
}
package DB;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DB {
public static String db_url = "jdbc:mysql://localhost:3306/info_s";
public static String db_user = "root";
public static String db_pass = "z376371066.";
public static Connection getConn () {
Connection conn = null;
try {
Class.forName("com.mysql.jdbc.Driver");//加载驱动
conn = DriverManager.getConnection(db_url, db_user, db_pass);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
/**
* 关闭连接
* @param state
* @param conn
*/
public static void close (Statement state, Connection conn) {
if (state != null) {
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close (ResultSet rs, Statement state, Connection conn) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (state != null) {
try {
state.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws SQLException {
Connection conn = getConn();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql ="select * from sjzsubway";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
if(rs.next()){
System.out.println("空");
}else{
System.out.println("不空");
}
}
}
package Dao;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import DB.DB;
import Entity.Station;
public class Dao {
public List<Station> getStationByName(String name) {
String sql = "select * from sjzsubway where name ='" + name + "'";
Connection conn = DB.getConn();
Statement state = null;
ResultSet rs = null;
List<Station> list = new ArrayList<>();
Station bean = null;
try {
state = conn.createStatement();
rs = state.executeQuery(sql);
while (rs.next()) {
int id = rs.getInt("id");
bean = new Station(id,name);
list.add(bean);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DB.close(rs, state, conn);
}
return list;
}
public ResultSet getStationById(int id) {
Connection conn = DB.getConn();
Statement state = null;
ResultSet rs = null;
try {
String sql = "select * from sjzsubway where id = '" + id + "'";
state = conn.createStatement();
rs = state.executeQuery(sql);
} catch (Exception e) {
e.printStackTrace();
}
return rs;
}
public List<Station> getSameAll(int number) {
String sql = "select * from sjzsubway where id like'" + number + "__'";
Connection conn = DB.getConn();
Statement state = null;
ResultSet rs = null;
List<Station> list = new ArrayList<>();
Station bean = null;
try {
state = conn.createStatement();
rs = state.executeQuery(sql);
while (rs.next()) {
String name = rs.getString("name");
int id = rs.getInt("id");
bean = new Station(id,name);
list.add(bean);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DB.close(rs, state, conn);
}
return list;
}
}
package Servlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import Dao.Dao;
import Entity.Station;
/**
* Servlet implementation class StationServlet
*/
@WebServlet("/StationServlet")
public class StationServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
Dao dao = new Dao();
/**
* @see HttpServlet#HttpServlet()
*/
public StationServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
String method = req.getParameter("method");
if ("chaxun".equals(method)) {
chaxun(req,resp);
}
}
private void chaxun(HttpServletRequest req, HttpServletResponse resp)throws IOException, ServletException {
// TODO Auto-generated method stub
req.setCharacterEncoding("utf-8");
String startname = req.getParameter("startname");
String endname = req.getParameter("endname");
List<Station> stations1 = dao.getStationByName(startname);
List<Station> stations2 = dao.getStationByName(endname);
int num = 0;
int[] rute = new int[20] ;
for(int m = 0; m < stations1.size();m++) {
for (int i = 0; i < stations2.size(); i++) {//不需要换乘
if(((stations2.get(i).getId())/100==(stations1.get(m).getId())/100)&&stations2.get(i).getId()>stations1.get(m).getId()) {
for(int j =stations1.get(m).getId();j<= stations2.get(i).getId();j++) {
rute[num] = j;
num++;
}
}
else if(((stations2.get(i).getId())/100==(stations1.get(m).getId())/100)&&stations2.get(i).getId()<stations1.get(m).getId()) {
for(int j =stations1.get(m).getId();j>= stations2.get(i).getId();j--) {
rute[num] = j;
num++;
}
}
else {//需要换乘一次
int numid1 = 0,numid2 = 0;
int[] id1 = new int [5];
int[] id2 = new int [5];
int sum=0;
int number = 0;
for(int xx = 0; xx < stations1.size();xx++) {
for(int x = 0; x < stations2.size();x++) {
number=stations2.get(x).getId()/100;
List<Station> samerute = dao.getSameAll(number);//查询与终点站一条路线的所有站点的信息
for(int y = 0; y < samerute.size();y++) {
List<Station> samerute1 = dao.getStationByName(samerute.get(y).getName());
for(int z = 0; z < samerute1.size();z++) {
if((samerute1.get(z).getId()/100==stations1.get(xx).getId()/100)) {//查询终点线路上与起始站具有相同编码开头的站点名称,即中转站信息
String name = samerute1.get(z).getName();
List<Station> ids = dao.getStationByName(name);
for(int a = 0; a < ids.size();a++) {
if(ids.get(a).getId()/100==stations1.get(z).getId()/100) {
id1[numid1] = ids.get(a).getId();//与起始站编码开头相同的中转站的编号
numid1++;
}
if(ids.get(a).getId()/100==stations2.get(z).getId()/100) {
id2[numid2] = ids.get(a).getId();//与终点站编码开头相同的中转站的编号
numid2++;
}
}
if(id1[0]>stations1.get(z).getId()) {
if(id2[0]>stations2.get(x).getId()) {
for(int p = stations1.get(xx).getId();p<id1[0];p++) {
rute[sum]=p;
sum++;
}
for(int q =id2[0];q >=stations2.get(x).getId();q-- ) {
rute[sum]=q;
sum++;
}
}
else if(id2[0]<stations2.get(x).getId()) {
for(int p = stations1.get(xx).getId();p<id1[0];p++) {
rute[sum]=p;
sum++;
}
for(int q =id2[0];q <=stations2.get(x).getId();q++ ) {
rute[sum]=q;
sum++;
}
}
}
else if(id1[0]<stations1.get(z).getId()) {
if(id2[0]>stations2.get(x).getId()) {
for(int p = stations1.get(xx).getId();p>id1[0];p--) {
rute[sum]=p;
sum++;
}
for(int q =id2[0];q >=stations2.get(x).getId();q-- ) {
rute[sum]=q;
sum++;
}
}
else if(id2[0]<stations2.get(x).getId()) {
for(int p = stations1.get(xx).getId();p>id1[0];p--) {
rute[sum]=p;
sum++;
}
for(int q =id2[0];q <=stations2.get(x).getId();q++ ) {
rute[sum]=q;
sum++;
}
}
}
break;
}
break;
}
}
}
}
}
int sumi=0;
for(int ii= 1;ii<rute.length;ii++) {
if(rute[ii]!=0) {
sumi=sumi+1;
}
}
req.setAttribute("rute",rute);
req.setAttribute("sumi",sumi);
req.getRequestDispatcher("list.jsp").forward(req,resp);
}
}
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查询页面</title>
</head>
<body>
<%
Object message = request.getAttribute("message");//放置一个字符串,并取出
if(message!=null && !"".equals(message)){
%>
<script type="text/javascript">
alert("<%=request.getAttribute("message")%>");
</script>
<%} %>
<div align="center">
<h1 style="color: black;">站点信息查询</h1>
<form action="StationServlet?method=chaxun" method="post" οnsubmit="return check()">
<p>始发站<input type="text" id="startname" name="startname"/>
<p>终点站<input type="text" id="endname" name="endname" />
<p><button type="submit" class="b">查 询</button>
</form>
<a href="ditu.jsp" >查看地铁线路图</a>
</div>
<script type="text/javascript">
function check() {
var startname = document.getElementById("startname");;
var endname = document.getElementById("endname");
//非空
if(startname.value == '') {
alert('始发站不能为空');
startname.focus();
return false;
}
if(endname.value == '') {
alert('终点站不能为空');
endname.focus();
return false;
}
}
</script>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<jsp:useBean id="dao" class="Dao.Dao" scope="page"/>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查询结果页面</title>
</head>
<body>
<%
Object message = request.getAttribute("message");
if(message!=null && !"".equals(message)){
%>
<script type="text/javascript">
alert("<%=request.getAttribute("message")%>");
</script>
<%} %>
<div align="center">
<h1 style="color: black;">站点信息列表</h1>
<a href="index.jsp">返回查询界面</a>
<h3 style="color: black;">共${sumi}站</h3>
<table class="tb">
<tr>
<td>站点编号</td>
<td>站点名称</td>
</tr>
<%
int[] ids = (int[]) request.getAttribute("rute");
for(int i = 0 ; i < ids.length;i++){
ResultSet rs = dao.getStationById(ids[i]);
if(rs==null){
%>
<tr align="center" valign="middle"><td colspan="4">没有记录显示!</td>
</tr>
<%
}
while(rs.next()){
%>
<tr align="center" valign="middle" height="22">
<td><%=rs.getInt("id") %></td>
<td><%=rs.getString("name") %></td>
</tr>
<%
}
}
%>
</table>
</div>
</body>
</html>
代码运行截图:
无需换乘:鹿泉中心---柏林路
需要换乘: