android 地铁最短路线换乘查询系统(2)
16lz
2021-01-23
代码续......
GraphEntry类
- classGraphEntry{
- privateArrayList<Integer>list;
- privateintline;
- privateintinfo;
- publicGraphEntry(){
- list=newArrayList<Integer>();
- }
- publicvoidaddLine(intline){
- this.line|=line;
- }
- publicintgetLine(){
- returnline;
- }
- publicvoidsetInfo(intinfo){
- this.info=info;
- }
- publicintgetInfo(){
- returninfo;
- }
- publicvoidinsertItem(intid){
- list.add(id);
- }
- publicintgetItem(intindex){
- intid=list.get(index);
- returnid;
- }
- publicintsize(){
- returnlist.size();
- }
- }
TableEntry类
- classTableEntry{
- privatebooleanknown;
- privateintdist;
- privateintpath;
- publicvoidsetKnown(booleanflag){
- known=flag;
- }
- publicbooleangetKnown(){
- returnknown;
- }
- publicvoidsetDist(intdist){
- this.dist=dist;
- }
- publicintgetDist(){
- returndist;
- }
- publicvoidsetPath(intpath){
- this.path=path;
- }
- publicintgetPath(){
- returnpath;
- }
- }
核心类:
- classPathSearch{
- privateHashtable<Integer,String>mHashTable1;
- privateHashtable<String,Integer>mHashTable2;
- privateGraphEntrygraph[];
- privateTableEntrytable[];
- privateintvertexNum;
- privateStringbeginStation;
- privateintbeginVertex;
- privateStringendStation;
- privateintendVertex;
- privateStringmResult;
- privateArrayList<Integer>mPath;
- /**constructfunction*/
- publicPathSearch(){
- initHashTable();
- initGraph();
- makeGraph();
- addGraphDetail();
- initTable();
- }
- /**hashtableinit*/
- publicvoidinitHashTable(){
- inti,j,id=0;
- mHashTable1=newHashtable<Integer,String>();
- mHashTable2=newHashtable<String,Integer>();
- for(i=0;i<ResFinalVars.lines.length;i++)
- {
- for(j=0;j<ResFinalVars.lines[i].length;j++){
- if(mHashTable1.contains(ResFinalVars.lines[i][j])==false)
- {
- mHashTable1.put(id,ResFinalVars.lines[i][j]);
- mHashTable2.put(ResFinalVars.lines[i][j],id);
- id++;
- }
- }
- }
- vertexNum=id;
- }
- /**returnidbystring*/
- publicintfindIdByKey(Stringkey){
- returnmHashTable2.get(key);
- }
- /**returnstringbyid*/
- publicStringfindStrById(intid){
- returnmHashTable1.get(id);
- }
- /**graphinit*/
- publicvoidinitGraph(){
- intvertexNum=this.getVertexNum();
- graph=newGraphEntry[vertexNum];
- for(inti=0;i<vertexNum;i++)
- {
- graph[i]=newGraphEntry();
- }
- mPath=newArrayList<Integer>();
- }
- /**graphmake*/
- publicvoidmakeGraph(){
- inti,j,id,index;
- for(i=0;i<ResFinalVars.lines.length;i++)
- {
- for(j=1;j<ResFinalVars.lines[i].length-1;j++)
- {
- id=findIdByKey(ResFinalVars.lines[i][j]);
- graph[id].insertItem(findIdByKey(ResFinalVars.lines[i][j+1]));
- graph[id].insertItem(findIdByKey(ResFinalVars.lines[i][j-1]));
- }
- index=0;
- graph[findIdByKey(ResFinalVars.lines[i][index])].insertItem(findIdByKey(ResFinalVars.lines[i][index+1]));
- index=ResFinalVars.lines[i].length-1;
- graph[findIdByKey(ResFinalVars.lines[i][index])].insertItem(findIdByKey(ResFinalVars.lines[i][index-1]));
- }
- }
- /**addgraphdetail,linenumberandotherinfo*/
- publicvoidaddGraphDetail(){
- inti,j,id;
- //addlineinfo
- for(i=0;i<ResFinalVars.lines.length;i++)
- {
- for(j=0;j<ResFinalVars.lines[i].length;j++)
- {
- id=findIdByKey(ResFinalVars.lines[i][j]);
- graph[id].setInfo(ResFinalVars.NORMAL);
- switch(i){
- case0:
- graph[id].addLine(ResFinalVars.LINESINFO.LINE1.getValue());
- break;
- case1:
- graph[id].addLine(ResFinalVars.LINESINFO.LINE2.getValue());
- break;
- case2:
- graph[id].addLine(ResFinalVars.LINESINFO.LINE3.getValue());
- break;
- case3:
- graph[id].addLine(ResFinalVars.LINESINFO.LINE3.getValue());
- break;
- case4:
- graph[id].addLine(ResFinalVars.LINESINFO.LINE4.getValue());
- break;
- case5:
- graph[id].addLine(ResFinalVars.LINESINFO.LINE5.getValue());
- break;
- case6:
- graph[id].addLine(ResFinalVars.LINESINFO.LINE8.getValue());
- break;
- case7:
- graph[id].addLine(ResFinalVars.LINESINFO.LINEGF.getValue());
- break;
- }
- }
- }
- //addtransitstationinfo
- for(i=0;i<ResFinalVars.transit_stations.length;i++)
- {
- id=findIdByKey(ResFinalVars.transit_stations[i]);
- graph[id].setInfo(ResFinalVars.TRANSIT);
- }
- }
- /**tableinit*/
- publicvoidinitTable(){
- table=newTableEntry[this.getVertexNum()];
- for(inti=0;i<table.length;i++)
- {
- table[i]=newTableEntry();
- }
- }
- /**tableclear*/
- publicvoidclearTable(){
- for(inti=0;i<table.length;i++)
- {
- table[i].setKnown(false);
- table[i].setDist(ResFinalVars.INFINITE);
- table[i].setPath(ResFinalVars.UNKNOWN);
- }
- }
- /**setbeginvertexbyid*/
- publicbooleansetBeginVertex(intid){
- clearTable();
- if(mHashTable1.containsKey(id)==true)
- {
- beginVertex=id;
- beginStation=findStrById(id);
- table[id].setDist(0);
- returntrue;
- }
- returnfalse;
- }
- /**setbeginvertexbyname*/
- publicbooleansetBeginVertex(Stringname){
- intid;
- clearTable();
- if(mHashTable2.containsKey(name)==true)
- {
- id=findIdByKey(name);
- beginVertex=id;
- beginStation=name;
- table[id].setDist(0);
- returntrue;
- }
- returnfalse;
- }
- /**getbeginvertexinid*/
- publicintgetBeginVertexId(){
- returnbeginVertex;
- }
- /**getendvertexinname*/
- publicStringgetBeginVertexName(){
- returnbeginStation;
- }
- /**setendvertexbyid*/
- publicbooleansetEndVertex(intid){
- if(mHashTable1.containsKey(id)==true)
- {
- endVertex=id;
- endStation=findStrById(id);
- returntrue;
- }
- returnfalse;
- }
- /**setendvertexbyname*/
- publicbooleansetEndVertex(Stringname){
- if(mHashTable2.containsKey(name)==true)
- {
- endVertex=findIdByKey(name);
- endStation=name;
- returntrue;
- }
- returnfalse;
- }
- /**getendvertexinid*/
- publicintgetEndVertexId(){
- returnendVertex;
- }
- /**getendvertexinname*/
- publicStringgetEndVertexName(){
- returnendStation;
- }
- /**getVertexnumber*/
- publicintgetVertexNum(){
- returnvertexNum;
- }
- /**startSearch*/
- publicvoidstartSearch(){
- intcurrDist,v,w,i;
- for(currDist=0;currDist<this.getVertexNum();currDist++)
- {
- for(v=0;v<this.getVertexNum();v++)
- {
- if((table[v].getKnown()==false)&&(table[v].getDist()==currDist))
- {
- table[v].setKnown(true);
- for(i=0;i<graph[v].size();i++)
- {
- w=graph[v].getItem(i);
- if(table[w].getDist()==ResFinalVars.INFINITE)
- {
- table[w].setDist(currDist+1);
- table[w].setPath(v);
- }
- }
- }
- }
- }
- }
- /**findpath*/
- publicvoidfindPath(intid){
- if(table[id].getDist()!=0)
- {
- findPath(table[id].getPath());
- }
- mPath.add(id);
- }
- /**getlineinfo*/
- publicStringgetLineInfo(intindex){
- Stringret="";
- switch(index)
- {
- caseResFinalVars.LINE1:
- ret+=ResFinalVars.lines_number[0];
- break;
- caseResFinalVars.LINE2:
- ret+=ResFinalVars.lines_number[1];
- break;
- caseResFinalVars.LINE3:
- ret+=ResFinalVars.lines_number[2];
- break;
- caseResFinalVars.LINE4:
- ret+=ResFinalVars.lines_number[3];
- break;
- caseResFinalVars.LINE5:
- ret+=ResFinalVars.lines_number[4];
- break;
- caseResFinalVars.LINE8:
- ret+=ResFinalVars.lines_number[7];
- break;
- caseResFinalVars.LINEGF:
- ret+=ResFinalVars.lines_number[8];
- break;
- }
- returnret;
- }
- /**processpath*/
- publicvoidmakePathPrompt(){
- Stringret="最短路线:",linenum="";
- inti,id=beginVertex,previd,nextid,cnt=0;
- //clearpathhistory
- mPath.clear();
- //findthepath
- findPath(this.getEndVertexId());
- if(mPath.size()==1)//beginVertex==endVertex
- {
- ret="您已经在"+findStrById(id)+"了,无需乘坐地铁";
- mResult=ret;
- return;
- }
- for(i=0;i<mPath.size();i++)
- {
- id=mPath.get(i);
- if(i==0)//id==beginVertex
- {
- nextid=mPath.get(i+1);
- linenum=getLineInfo(graph[id].getLine()&graph[nextid].getLine());
- ret+="在"+findStrById(id)+"乘坐"+linenum;
- }
- elseif(i==mPath.size()-1)//id==endVertex
- {
- cnt++;
- ret+="(坐"+cnt+"站)到"+findStrById(id)+"下车";
- }
- elseif(graph[id].getInfo()==ResFinalVars.NORMAL)
- {
- cnt++;
- }
- elseif(graph[id].getInfo()==ResFinalVars.TRANSIT)
- {
- cnt++;
- if(i+1<mPath.size())//makesure(i+1)notoverflow
- {
- previd=mPath.get(i-1);
- nextid=mPath.get(i+1);
- linenum=getLineInfo(graph[id].getLine()&graph[nextid].getLine());
- if((graph[previd].getLine()&graph[id].getLine())!=(graph[nextid].getLine()&graph[id].getLine()))
- {
- ret+="(坐"+cnt+"站)"+"到"+findStrById(id)+"换乘"+linenum;
- cnt=0;
- }
- }
- }
- }
- mResult=ret;
- }
- /**getresult*/
- publicStringgetResult(){
- returnmResult;
- }
- }
Activity类:
- publicclassMetroSearchextendsActivity{
- privateSpinnermSpinnerBeginStation,mSpinnerEndStation;
- privateArrayAdapter<String>mAdapterStations;
- privateTextViewmTextView;
- privateButtonmSearch,mShowMap;
- privatePathSearchmPathSearch;
- privateStringmStationNames[];
- publicintmBeginStation;
- publicintmEndStation;
- publicvoiddoLineSearch(){
- Stringstr;
- mPathSearch.setBeginVertex(mBeginStation);
- mPathSearch.setEndVertex(mEndStation);
- mPathSearch.startSearch();
- mPathSearch.makePathPrompt();
- str=mPathSearch.getResult();
- mTextView.setText(str);
- }
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mPathSearch=newPathSearch();
- mTextView=(TextView)findViewById(R.id.result);
- mStationNames=newString[mPathSearch.getVertexNum()];
- for(inti=0;i<mPathSearch.getVertexNum();i++)
- {
- mStationNames[i]=mPathSearch.findStrById(i);
- }
- mAdapterStations=newArrayAdapter<String>(this,android.R.layout.simple_spinner_item,mStationNames);
- mAdapterStations.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- mSpinnerBeginStation=(Spinner)findViewById(R.id.station_from);
- mSpinnerBeginStation.setAdapter(mAdapterStations);
- mSpinnerEndStation=(Spinner)findViewById(R.id.station_to);
- mSpinnerEndStation.setAdapter(mAdapterStations);
- /*
- classOnItemSelectedListenerBeginStationimplementsOnItemSelectedListener{
- publicvoidonItemSelected(AdapterView<?>parent,Viewview,intpos,longid){
- mBeginStation=pos;
- }
- publicvoidonNothingSelected(AdapterViewparent){
- //Donothing.
- }
- }
- classOnItemSelectedListenerEndStationimplementsOnItemSelectedListener{
- publicvoidonItemSelected(AdapterView<?>parent,Viewview,intpos,longid){
- mEndStation=pos;
- }
- publicvoidonNothingSelected(AdapterViewparent){
- //Donothing.
- }
- }
- mSpinnerBeginStation.setOnItemSelectedListener(newOnItemSelectedListenerBeginStation());
- mSpinnerEndStation.setOnItemSelectedListener(newOnItemSelectedListenerEndStation());
- */
- //thisisthebettercodethanthat
- classOnSpinnerItemSelectedListenerimplementsOnItemSelectedListener{
- publicvoidonItemSelected(AdapterView<?>parent,Viewview,intpos,longid){
- switch(parent.getId())//attention:shouldnotbeview.getId()
- {
- caseR.id.station_from:
- mBeginStation=pos;
- break;
- caseR.id.station_to:
- mEndStation=pos;
- break;
- default:
- Log.d("xiaoben","viewidnotmatch");
- break;
- }
- }
- publicvoidonNothingSelected(AdapterViewparent){
- //Donothing.
- }
- }
- mSpinnerBeginStation.setOnItemSelectedListener(newOnSpinnerItemSelectedListener());
- mSpinnerEndStation.setOnItemSelectedListener(newOnSpinnerItemSelectedListener());
- /*button*/
- mSearch=(Button)findViewById(R.id.search_btn);
- mSearch.setOnClickListener(newView.OnClickListener(){
- publicvoidonClick(Viewv){
- //Performactiononclick
- doLineSearch();
- }
- });
- mShowMap=(Button)findViewById(R.id.map_btn);
- mShowMap.setOnClickListener(newView.OnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- //TODOAuto-generatedmethodstub
- Intentintent=newIntent();
- intent.setClass(MetroSearch.this,MapDisplay.class);
- startActivity(intent);
- }
- });
- }
- }
更多相关文章
- Android学习路线-mars
- Android学习路线:如何成长为高级工程师
- Android 开启之旅-学习路线
- Android推荐学习路线图,职业规划
- 通过Android上的意图启动Google地图路线
- Android游戏与应用开发最佳学习路线图
- Android学习路线(五)开启另一个Activity