**
* 公交换乘一站的算法思想:
* (注意:车次信息、站点信息、公交信息是等价的都是以HashMap的形式存储信息)
* 1.从数据库中获得所有公交信息存储到ArrayList,每个具体信息的元数据有三个:
* 公交车次、公交站点、该公交站点距离该公交车次的始发站点的站数,具体信息用HashMap保存
* 2.然后把公交信息数据进行结构化,把所有公交站点抽出,再把每一个站点对应的所有车次抽出
* 与其一一对应,单一的车次信息用HashMap存储,站点对应的所有车次信息用ArrayList存储,
* 所有的站点有经过站点的车次信息用HashMap存储
* 3.根据查询要求,分别从结构化以后的公交信息数据中找到,经过出发地的所有车次,经过目的地
* 的所有车次,然后在分别遍历每个车次,筛选出符合要求的中转站点,筛选规则是:每查询出一个
* 站点时,得到该站点距离该站点对应车次的始发站的站数,如果这个站数小于查询站点距离该车次的始
* 发站的站数,那么就符合规则,便把该站点信息保存到符合站点的ArrayList中,反之亦然
* 4.分别得到查询条件中出发地和目的地的中转站点信息(中转站点信息存储在ArrayList中),然
* 后遍历两个中转站点信息的集合,得到最终的具体中转信息(最终中转信息也是用ArrayList存储)
*/
package bustransfer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
public class BusTransfer {
private String start = null;// 出发地
private String whither = null;// 目标地
private List schedule = null;// 用于缓存列车时刻表。
private HashMap stationsOfLine = null; // 所有公交线路,每个list存储该线路经过的所有车站。
private HashMap linesOfStation = null;// 所有车站,每个list中存储通过该车站的所有车次。
// private ArrayList startLine = new ArrayList ();//
// 途经出发地的所有车次。
// private ArrayList whitherLine = new ArrayList ();//
// 途经目的地的所有车次。
private ArrayList
/**
* 站点筛选规则:把符合规则的站点添分别放入
*
* @param startSta
* @param whitherSta
*/
private void getStationsInLine(String startSta, String whitherSta) {
// 获得经过初始站点的所有公交车次
ArrayList firTrainLine = linesOfStation.get(startSta);
// 获得经过所有目的站点的公交车次
ArrayList secTrainLine = linesOfStation.get(whitherSta);
ArrayList station;
HashMap line = null;
int transferStaNo = 0;
// String stationName = null;
String trainNo = "";
if (firTrainLine != null) {
Iterator firIt = firTrainLine.iterator();
while (firIt.hasNext()) {
// 取出一个存储车站信息HashMap
line = (HashMap) firIt.next();
// 取出车次信息
trainNo = (String) line.get("busLine");
transferStaNo = (Integer) line.get("stationNo");
// 取出车次trainNo经过的所有站点信息
station = stationsOfLine.get(trainNo);
Iterator it = station.iterator();
while (it.hasNext()) {
Map map = (Map) it.next();// trainNo's map.
int i = (Integer) map.get("stationNo");
// 筛选站点规则:如果该站点距离初始站点距离比出发站点的距离初始站点的距离大,那么就把该站点存储到
// firLineStaList,反之就做反车了,所以那些站点不必加入firLineStaList中
if (i > transferStaNo) {
//
firLineStaList.add(map);
}
}
}
}
if (secTrainLine != null) {
Iterator secIt = secTrainLine.iterator();
while (secIt.hasNext()) {
line = (HashMap) secIt.next();
trainNo = (String) line.get("busLine");
transferStaNo = (Integer) line.get("stationNo");
station = stationsOfLine.get(trainNo);
Iterator it = station.iterator();
while (it.hasNext()) {
Map map = (Map) it.next();
int i = (Integer) map.get("stationNo");
if (i < transferStaNo) {
secLineStaList.add(map);
}
}
}
}
}
/**
*
* create date:2008-5-19 author:Administrator
*
* @return
*/
private ArrayList checkCrossLine() {
ArrayList crossLineList = new ArrayList ();// 相交线路的集合,即是所有的换乘方法的集合
ArrayList lsStart = firLineStaList;// 经过起点站的所有车次的经停站站信息。
ArrayList lsEnd = secLineStaList;// 经过目的站的所有车次的经停站站信息。
if (lsStart != null && !lsStart.isEmpty() && lsEnd != null
&& !lsEnd.isEmpty()) {
for (Map mapStart : lsStart) {
for (Map mapEnd : lsEnd) {
if (IsInTheSameCity(mapStart.get("up"), mapEnd.get("up"))) {
// 将相交线路信息存入crossLine,存储某一个具体的换乘方法
Map crossLine = new HashMap (
4, 0.8f);
// 把第一次要做到车次放如crossLine
crossLine.put("firstLine", mapStart.get("busLine"));
// 把要换乘的车次放入到crossLine
crossLine.put("secondLine", mapEnd.get("busLine"));
// 把中转站点放入到crossLine
crossLine.put("transferSta", mapEnd.get("up"));
// crossLine.put("transferSta",(String)startInf.get("up"));
// 将包含相交线路信息的HashMap存入List
// 也即是把具体某个换乘方法放入crossLineList
crossLineList.add(crossLine);
} else {
continue;
}
}
}
} else {
crossLineList = null;
}
return crossLineList;
}
private boolean IsInTheSameCity(String station1, String station2) {
if (station1.contains(station2) || station2.contains(station1)) {
// System.out.println(station1+"#########"+station2);
Connection con = null;
String url = "jdbc:mysql://127.0.0.1:3306/souwhat?autoReconnect=true&useUnicode=true&characterEncoding=GBK&mysqlEncoding=GBK";
String user = "root";
String psWord = "";
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("The Exception at load the Driver");
}
try {
con = DriverManager.getConnection(url, user, psWord);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("The Exception at creat the connection");
}
return con;
}
private void closeConnection(Connection conn) throws Exception {
if (conn != null) {
conn.close();
}
}
private List executeQuery(String sql) throws Exception {
// System.out.println("executeQuery(sql): " + sql);
List list = new ArrayList();
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
conn = getConnection();
stmt = conn.createStatement();
System.out.println(sql);
rs = stmt.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
while (rs.next()) {
Map map = new HashMap();
for (int i = 1; i <= rsmd.getColumnCount(); i++) {
// 每一行所有列存入HashMap中
map.put(rsmd.getColumnName(i), rs.getObject(i));
}
// 所有行存入List中
list.add(map);
}
} catch (Exception e) {
System.out.println("数据库查询出错!");
e.printStackTrace();
} finally {
if (rs != null)
rs.close();
closeConnection(conn);
}
return list;
}
}
|