www.pudn.com > QingHuangDaoBus.rar > Finding_way.java


//Finding_way.java
//该类用来计算乘车方案。
import java.net.URL;
import java.sql.*;
public class Finding_way
{
private Beg_end_sta inputstation;//起始站点
private Path [] bestpath;//20个乘车方案
private boolean isfinding;//是否找到可行的乘车方案
private int pathTotal;
private int errState=0;//1 表示没有直达方案 2表示起点站与终点站为同一站点
//3 表示间接查询中,起点站不存在 5该车次无车站
//6 倒一次车的中间站点不存在

public Finding_way()
{

}

public Finding_way( Beg_end_sta inputstation,Path [] bestpath, boolean isfinding )
{
this.inputstation=inputstation;

this.bestpath=bestpath;
this.isfinding=isfinding;
}
public Finding_way ( Beg_end_sta inputstation )
{
this.inputstation=inputstation;

}
public void createFindWay(Beg_end_sta inputstation)
{
this.inputstation=new Beg_end_sta();
this.inputstation=inputstation;
this.bestpath=new Path[20];



}
public void createFindWay(Station begining,Station ending )
{
inputstation=new Beg_end_sta();
inputstation.set_be_sta( begining , ending );
bestpath=new Path[20];
for ( int i=0; i<20; i++)
{
bestpath[i]=new Path();
}

}

public void createFindWay(String begining,String ending )
{
inputstation=new Beg_end_sta();
inputstation.set_be_sta( new Station(begining) , new Station (ending) );
bestpath=new Path[20];
for ( int i=0; i<20; i++)
{
bestpath[i]=new Path();


}

}

public void setinputstation (Beg_end_sta inputstation )
{
this.inputstation=inputstation;
}
public Beg_end_sta getinputstation( )
{
return inputstation;
}
public void setbestpath(Path [] bestpath )
{
this.bestpath=bestpath;
}
public Path[] getbestpath()
{
return bestpath;
}
public void setisfinding( boolean isfinding )
{
this.isfinding=isfinding;
}

//给出不倒车直接到达的方案
public boolean direct_find()
{
int i=0;
int resBegSeq,resEndSeq;
int resBegSeqShadow,resEndSeqShadow;
int distance;//起点站到终点站所经过的车站数
String [] resBusNo=new String [20];
String begining,ending;
String queryBusNo,queryBegSeq,queryEndSeq,queryPassSta;
String queryPath;
//String busNo;
begining=inputstation.getBegName();
ending=inputstation.getEndName();
if(begining==ending)
{
//System.out.println("起点和终点是同一站点");
errState=2; //起点和终点是同一站点
return false;



}

queryBusNo="SELECT bus_no FROM bus_table WHERE station_name='" + begining + "' AND bus_no In ( SELECT bus_no FROM bus_table WHERE station_name='" + ending +"')";
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection("jdbc:odbc:bus");
Statement stmt;
stmt=con.createStatement();
ResultSet resultBusNo ,resultBegSeq,resultEndSeq,resultPassSta;
resultBusNo=stmt.executeQuery( queryBusNo );
//System.out.println(resultBusNo);
//找到从起点直达终点的一系列公交车次
//System.out.println(resultBusNo);
/* if (resultBusNo)//找到合适的函数来检查是否有有效数据!!!!!!!!!!!!!!!!!
{
System.out.println("无可行方案 ");
errState=1;
return false;
}
*/
if( !resultBusNo.next() )
{
errState=1;
//System.out.println(resBusNo[0]+"dd");
return false;
}
else
{
resBusNo[i]=resultBusNo.getString(1);
bestpath[i].addSegment( resBusNo[i] );
i++;

}


while( resultBusNo.next() &amt;&amt; i<20 )
{

resBusNo[i]=resultBusNo.getString(1);


bestpath[i].addSegment( resBusNo[i] );


//System.out.print("s"+resBusNo[i]+"f ");
i++;
}
pathTotal=i;
resultBusNo.close();
//System.out.println(" ");
//System.out.println(" ");

//找到各公交车次中从起点车站到终点车站在整条公交线路中所经过的车站
//System.out.println(" i="+i);
for(int j=0;j<i;j++)
{
//起点车站所处的次序
//System.out.print(" 起始车站的序号 ");
queryBegSeq="SELECT station_sequence FROM bus_table WHERE station_name='"+ begining +" ' AND bus_no='"+resBusNo[j]+"' ";
resultBegSeq=stmt.executeQuery(queryBegSeq);
resultBegSeq.next();
resBegSeq=resultBegSeq.getInt("station_sequence");
//System.out.println(resBegSeq);
resultBegSeq.close();


//终点车站所处的次序
//System.out.print(" 终点车站的序号 ");
queryEndSeq="SELECT station_sequence FROM bus_table WHERE station_name='"+ ending +"' AND bus_no='"+resBusNo[j]+"'";
resultEndSeq=stmt.executeQuery(queryEndSeq);
resultEndSeq.next();
resEndSeq=resultEndSeq.getInt("station_sequence");
// System.out.println(resEndSeq);
resultEndSeq.close();
//查找所经过的车站

queryPath="";
resBegSeqShadow=resBegSeq;
resEndSeqShadow=resEndSeq;
distance=resEndSeqShadow-resBegSeqShadow;

if(distance>0)
{
queryPath=" ";
}
else
{
queryPath=" DESC ";
}

//System.out.println(queryPath);

queryPath="SELECT station_name FROM bus_table WHERE bus_no='"+resBusNo[j]+"' AND station_sequence BETWEEN " +resBegSeq+" AND "+resEndSeq+" ORDER BY station_sequence " +queryPath;


//System.out.println(queryPath);
resultPassSta=stmt.executeQuery(queryPath);
//ResultSetMetaData rsmd=resultPassSta.getMetaData();
//int numCols=rsmd.getColumnCount();
//System.out.print(" 乘车路线: "+resBusNo[j]+"路车方案 ");
String busStation;
int q=0;
while(resultPassSta.next())
{
busStation=resultPassSta.getString(1);

// System.out.print( busStation+" ");

bestpath[j].setPassSegment( busStation,q,0);
//System.out.print(" ");
q++;
}


//resEndSeq=resultEndSeq.getInt("station_sequence");
//System.out.println(resEndSeq);
resultPassSta.close();
//System.out.println("");
//System.out.println("");




}

//System.out.println(" ");
// System.out.println("Create successfully!");
//resultBegSeq.close();
//resultEndSeq.close();

stmt.close();
con.close();


}
catch(SQLException ex)
{
System.out.println("\n***SQLException Caught ***\n");
while(ex!=null)
{
System.out.println(" SQLState: " +ex.getSQLState() );
System.out.println(" Message: " +ex.getMessage() );
System.out.println("Vendor: "+ex.getErrorCode());
ex=ex.getNextException();
System.out.println(" ");

}

}
catch(java.lang.Exception ex )
{
ex.printStackTrace();
}




return true;
}

//给出倒一次车的,间接到达方案
public boolean indirect_find()
{
String begining=inputstation.getBegName();
String ending=inputstation.getEndName();
String queBegBusNo="SELECT bus_no FROM bus_table WHERE station_name='"+begining+"'";
String queEndBusNo="SELECT bus_no FROM bus_table WHERE station_name='"+ending+"'";
String [] begBusNo=new String [20];
String [] endBusNo=new String [20];
String [] midBusSta=new String [20];
int i=0,j=0;
//System.out.println(queBegBusNo);
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection("jdbc:odbc:bus");
Statement stmt;
stmt=con.createStatement();

ResultSet resultBegBusNo,resultEndBusNo;

//经过起始站点的线路名称
resultBegBusNo=stmt.executeQuery( queBegBusNo );

if( !resultBegBusNo.next() )
{
//System.out.println(resBusNo[0]+"dd");
//间接查询中,起点站不存在,为错误三
errState=3;
return false;
}
else
{
begBusNo[i]=resultBegBusNo.getString(1);

//System.out.print(begBusNo[i]+" ");
i++;
}


while( resultBegBusNo.next() &amt;&amt; i<20 )
{

begBusNo[i]=resultBegBusNo.getString(1);

//System.out.print(begBusNo[i]+" ");
i++;
}

resultBegBusNo.close();



//System.out.println("beging and end");


resultEndBusNo=stmt.executeQuery( queEndBusNo );

if( !resultEndBusNo.next() )
{

//间接查询中,终点站不存在,为错误三
errState=3;
return false;
}
else
{
endBusNo[j]=resultEndBusNo.getString(1);

// System.out.print(endBusNo[j]+" ");
j++;
}


while( resultEndBusNo.next() &amt;&amt; i<20 )
{

endBusNo[j]=resultEndBusNo.getString(1);

//System.out.print(endBusNo[j]+" ");
j++;
}
resultEndBusNo.close();

//System.out.println("bus station");

int q=0,l=0,k=0;
//ResultSet resultBegBusNo,resultEndBusNo;
String [] passBegSta=new String [40];
String [] passEndSta=new String [40];
String quePassBegSta, quePassEndSta;

//System.out.println(i+"bus station"+j);
for(int n=0; n<i; n++)
for(int m=0; m<j; m++)
{

//查找起点站可以到达的站点。
quePassBegSta="SELECT station_name FROM bus_table WHERE bus_no='"+begBusNo[n]+" '";
ResultSet resultPassBegSta=stmt.executeQuery( quePassBegSta );
l=0;

if( !resultPassBegSta.next() )
{

errState=5; //该车次无车站
return false;
}
else
{
passBegSta[l]=resultPassBegSta.getString(1);

//System.out.print(passBegSta[l]+" ");
l++;
}


while( resultPassBegSta.next() &amt;&amt; l<40 )
{

passBegSta[l]=resultPassBegSta.getString(1);

//System.out.print(passBegSta[l]+" ");
l++;
}

resultPassBegSta.close();



//查找可以到达终点站的站点。
//System.out.println(" 查找可以到达终点站的站点 ");
quePassEndSta="SELECT station_name FROM bus_table WHERE bus_no='"+endBusNo[m]+" '";
ResultSet resultPassEndSta=stmt.executeQuery( quePassEndSta );
k=0;

if( !resultPassEndSta.next() )
{

errState=5; //该车次无车站
return false;
}
else
{
passEndSta[k]=resultPassEndSta.getString(1);

//System.out.print(passEndSta[k]+" ");
k++;
}


while( resultPassEndSta.next() &amt;&amt; k<40 )
{

passEndSta[k]=resultPassEndSta.getString(1);

//System.out.print(passEndSta[k]+" ");

k++;
}

resultPassEndSta.close();
//System.out.println( " " );
//System.out.println( " Middle bus station " );
//System.out.println( l+ " " +k);
//System.out.println("a"+passBegSta[8]+"a");
//System.out.println("a"+passEndSta[5]+"a");
//if(passBegSta[8]==passEndSta[5])
//System.out.print( " true11" );
//寻找即可直达起点站又可到达终点站的车站
for(int s=0; s<l ;s++)

for(int t=0; t<k ;t++)
{
//if(s==8 &amt;&amt; t==5 )
//System.out.print( " true" );
if(passBegSta[s].equals(passEndSta[t]))
{


midBusSta[q]=passBegSta[s];
//System.out.println(midBusSta[q]);
q++;
}

}

if (q==0)
{
errState=6;
return false;
}

//System.out.println( midBusSta[0] );
//System.out.println( q+ "End Middle station "+midBusSta[q-1] );



// System.out.println(i+"bus station"+j);
}



Finding_way firSegment=new Finding_way();
Finding_way secSegment=new Finding_way();

//System.out.println( begining );
//System.out.println( ending );
//System.out.println( midBusSta[0] );
int x=0;
for(int w=0; w<q; w++)
{

firSegment.createFindWay(begining,midBusSta[w] );
firSegment.direct_find();
//firSegment.show();
secSegment.createFindWay( midBusSta[w],ending );
secSegment.direct_find();
//secSegment.show();
firSegment.getPathTotal();
secSegment.getPathTotal();

for( i=0; i<firSegment.getPathTotal();i++)
for( j=0; j<secSegment.getPathTotal(); j++)
{
if(x>=20) break;

this.bestpath[x].addSegment( firSegment.bestpath[i]);
this.bestpath[x].addSegment( secSegment.bestpath[j]);
x++;

}

}
pathTotal=x;


//System.out.println("Create successfully!");
stmt.close();
con.close();


}
catch(SQLException ex)
{
System.out.println("\n***SQLException Caught ***\n");
while(ex!=null)
{
System.out.println(" SQLState: " +ex.getSQLState() );
System.out.println(" Message: " +ex.getMessage() );
System.out.println("Vendor: "+ex.getErrorCode());
ex=ex.getNextException();
System.out.println(" ");

}

}
catch(java.lang.Exception ex )
{
ex.printStackTrace();
}

return true;


}
//根据站点使用频率,给出模糊方案
public boolean mistiness_find()
{
return true;
}
public boolean find_bestway ()
{
boolean finded;
finded=direct_find();
if(!finded)
{
finded=indirect_find();
if(!finded)
{
return false;
}
}
return true;

}
public void show()
{ //System.out.println(" show");
//System.out.println(pathTotal);
//pathTotal=1;
int m;
for(int n=0;n<pathTotal;n++)
{
m=n+1;
System.out.println("第" +m+ "套乘车方案 ");
bestpath[n].show();
System.out.println(" ");
}
}


public String output()
{
String outData="";
int m;
for(int n=0;n<pathTotal;n++)
{
m=n+1;
//System.out.println(" 方案"+m);
outData="乘车方案 \n";
outData=outData+bestpath[n].outputPath()+" \n";

}

return outData;
}




public int getPathTotal()
{
return pathTotal;
}

}