代码续......

GraphEntry类

        
  1. classGraphEntry{
  2. privateArrayList<Integer>list;
  3. privateintline;
  4. privateintinfo;
  5. publicGraphEntry(){
  6. list=newArrayList<Integer>();
  7. }
  8. publicvoidaddLine(intline){
  9. this.line|=line;
  10. }
  11. publicintgetLine(){
  12. returnline;
  13. }
  14. publicvoidsetInfo(intinfo){
  15. this.info=info;
  16. }
  17. publicintgetInfo(){
  18. returninfo;
  19. }
  20. publicvoidinsertItem(intid){
  21. list.add(id);
  22. }
  23. publicintgetItem(intindex){
  24. intid=list.get(index);
  25. returnid;
  26. }
  27. publicintsize(){
  28. returnlist.size();
  29. }
  30. }

TableEntry类

        
  1. classTableEntry{
  2. privatebooleanknown;
  3. privateintdist;
  4. privateintpath;
  5. publicvoidsetKnown(booleanflag){
  6. known=flag;
  7. }
  8. publicbooleangetKnown(){
  9. returnknown;
  10. }
  11. publicvoidsetDist(intdist){
  12. this.dist=dist;
  13. }
  14. publicintgetDist(){
  15. returndist;
  16. }
  17. publicvoidsetPath(intpath){
  18. this.path=path;
  19. }
  20. publicintgetPath(){
  21. returnpath;
  22. }
  23. }

核心类:

        
  1. classPathSearch{
  2. privateHashtable<Integer,String>mHashTable1;
  3. privateHashtable<String,Integer>mHashTable2;
  4. privateGraphEntrygraph[];
  5. privateTableEntrytable[];
  6. privateintvertexNum;
  7. privateStringbeginStation;
  8. privateintbeginVertex;
  9. privateStringendStation;
  10. privateintendVertex;
  11. privateStringmResult;
  12. privateArrayList<Integer>mPath;
  13. /**constructfunction*/
  14. publicPathSearch(){
  15. initHashTable();
  16. initGraph();
  17. makeGraph();
  18. addGraphDetail();
  19. initTable();
  20. }
  21. /**hashtableinit*/
  22. publicvoidinitHashTable(){
  23. inti,j,id=0;
  24. mHashTable1=newHashtable<Integer,String>();
  25. mHashTable2=newHashtable<String,Integer>();
  26. for(i=0;i<ResFinalVars.lines.length;i++)
  27. {
  28. for(j=0;j<ResFinalVars.lines[i].length;j++){
  29. if(mHashTable1.contains(ResFinalVars.lines[i][j])==false)
  30. {
  31. mHashTable1.put(id,ResFinalVars.lines[i][j]);
  32. mHashTable2.put(ResFinalVars.lines[i][j],id);
  33. id++;
  34. }
  35. }
  36. }
  37. vertexNum=id;
  38. }
  39. /**returnidbystring*/
  40. publicintfindIdByKey(Stringkey){
  41. returnmHashTable2.get(key);
  42. }
  43. /**returnstringbyid*/
  44. publicStringfindStrById(intid){
  45. returnmHashTable1.get(id);
  46. }
  47. /**graphinit*/
  48. publicvoidinitGraph(){
  49. intvertexNum=this.getVertexNum();
  50. graph=newGraphEntry[vertexNum];
  51. for(inti=0;i<vertexNum;i++)
  52. {
  53. graph[i]=newGraphEntry();
  54. }
  55. mPath=newArrayList<Integer>();
  56. }
  57. /**graphmake*/
  58. publicvoidmakeGraph(){
  59. inti,j,id,index;
  60. for(i=0;i<ResFinalVars.lines.length;i++)
  61. {
  62. for(j=1;j<ResFinalVars.lines[i].length-1;j++)
  63. {
  64. id=findIdByKey(ResFinalVars.lines[i][j]);
  65. graph[id].insertItem(findIdByKey(ResFinalVars.lines[i][j+1]));
  66. graph[id].insertItem(findIdByKey(ResFinalVars.lines[i][j-1]));
  67. }
  68. index=0;
  69. graph[findIdByKey(ResFinalVars.lines[i][index])].insertItem(findIdByKey(ResFinalVars.lines[i][index+1]));
  70. index=ResFinalVars.lines[i].length-1;
  71. graph[findIdByKey(ResFinalVars.lines[i][index])].insertItem(findIdByKey(ResFinalVars.lines[i][index-1]));
  72. }
  73. }
  74. /**addgraphdetail,linenumberandotherinfo*/
  75. publicvoidaddGraphDetail(){
  76. inti,j,id;
  77. //addlineinfo
  78. for(i=0;i<ResFinalVars.lines.length;i++)
  79. {
  80. for(j=0;j<ResFinalVars.lines[i].length;j++)
  81. {
  82. id=findIdByKey(ResFinalVars.lines[i][j]);
  83. graph[id].setInfo(ResFinalVars.NORMAL);
  84. switch(i){
  85. case0:
  86. graph[id].addLine(ResFinalVars.LINESINFO.LINE1.getValue());
  87. break;
  88. case1:
  89. graph[id].addLine(ResFinalVars.LINESINFO.LINE2.getValue());
  90. break;
  91. case2:
  92. graph[id].addLine(ResFinalVars.LINESINFO.LINE3.getValue());
  93. break;
  94. case3:
  95. graph[id].addLine(ResFinalVars.LINESINFO.LINE3.getValue());
  96. break;
  97. case4:
  98. graph[id].addLine(ResFinalVars.LINESINFO.LINE4.getValue());
  99. break;
  100. case5:
  101. graph[id].addLine(ResFinalVars.LINESINFO.LINE5.getValue());
  102. break;
  103. case6:
  104. graph[id].addLine(ResFinalVars.LINESINFO.LINE8.getValue());
  105. break;
  106. case7:
  107. graph[id].addLine(ResFinalVars.LINESINFO.LINEGF.getValue());
  108. break;
  109. }
  110. }
  111. }
  112. //addtransitstationinfo
  113. for(i=0;i<ResFinalVars.transit_stations.length;i++)
  114. {
  115. id=findIdByKey(ResFinalVars.transit_stations[i]);
  116. graph[id].setInfo(ResFinalVars.TRANSIT);
  117. }
  118. }
  119. /**tableinit*/
  120. publicvoidinitTable(){
  121. table=newTableEntry[this.getVertexNum()];
  122. for(inti=0;i<table.length;i++)
  123. {
  124. table[i]=newTableEntry();
  125. }
  126. }
  127. /**tableclear*/
  128. publicvoidclearTable(){
  129. for(inti=0;i<table.length;i++)
  130. {
  131. table[i].setKnown(false);
  132. table[i].setDist(ResFinalVars.INFINITE);
  133. table[i].setPath(ResFinalVars.UNKNOWN);
  134. }
  135. }
  136. /**setbeginvertexbyid*/
  137. publicbooleansetBeginVertex(intid){
  138. clearTable();
  139. if(mHashTable1.containsKey(id)==true)
  140. {
  141. beginVertex=id;
  142. beginStation=findStrById(id);
  143. table[id].setDist(0);
  144. returntrue;
  145. }
  146. returnfalse;
  147. }
  148. /**setbeginvertexbyname*/
  149. publicbooleansetBeginVertex(Stringname){
  150. intid;
  151. clearTable();
  152. if(mHashTable2.containsKey(name)==true)
  153. {
  154. id=findIdByKey(name);
  155. beginVertex=id;
  156. beginStation=name;
  157. table[id].setDist(0);
  158. returntrue;
  159. }
  160. returnfalse;
  161. }
  162. /**getbeginvertexinid*/
  163. publicintgetBeginVertexId(){
  164. returnbeginVertex;
  165. }
  166. /**getendvertexinname*/
  167. publicStringgetBeginVertexName(){
  168. returnbeginStation;
  169. }
  170. /**setendvertexbyid*/
  171. publicbooleansetEndVertex(intid){
  172. if(mHashTable1.containsKey(id)==true)
  173. {
  174. endVertex=id;
  175. endStation=findStrById(id);
  176. returntrue;
  177. }
  178. returnfalse;
  179. }
  180. /**setendvertexbyname*/
  181. publicbooleansetEndVertex(Stringname){
  182. if(mHashTable2.containsKey(name)==true)
  183. {
  184. endVertex=findIdByKey(name);
  185. endStation=name;
  186. returntrue;
  187. }
  188. returnfalse;
  189. }
  190. /**getendvertexinid*/
  191. publicintgetEndVertexId(){
  192. returnendVertex;
  193. }
  194. /**getendvertexinname*/
  195. publicStringgetEndVertexName(){
  196. returnendStation;
  197. }
  198. /**getVertexnumber*/
  199. publicintgetVertexNum(){
  200. returnvertexNum;
  201. }
  202. /**startSearch*/
  203. publicvoidstartSearch(){
  204. intcurrDist,v,w,i;
  205. for(currDist=0;currDist<this.getVertexNum();currDist++)
  206. {
  207. for(v=0;v<this.getVertexNum();v++)
  208. {
  209. if((table[v].getKnown()==false)&&(table[v].getDist()==currDist))
  210. {
  211. table[v].setKnown(true);
  212. for(i=0;i<graph[v].size();i++)
  213. {
  214. w=graph[v].getItem(i);
  215. if(table[w].getDist()==ResFinalVars.INFINITE)
  216. {
  217. table[w].setDist(currDist+1);
  218. table[w].setPath(v);
  219. }
  220. }
  221. }
  222. }
  223. }
  224. }
  225. /**findpath*/
  226. publicvoidfindPath(intid){
  227. if(table[id].getDist()!=0)
  228. {
  229. findPath(table[id].getPath());
  230. }
  231. mPath.add(id);
  232. }
  233. /**getlineinfo*/
  234. publicStringgetLineInfo(intindex){
  235. Stringret="";
  236. switch(index)
  237. {
  238. caseResFinalVars.LINE1:
  239. ret+=ResFinalVars.lines_number[0];
  240. break;
  241. caseResFinalVars.LINE2:
  242. ret+=ResFinalVars.lines_number[1];
  243. break;
  244. caseResFinalVars.LINE3:
  245. ret+=ResFinalVars.lines_number[2];
  246. break;
  247. caseResFinalVars.LINE4:
  248. ret+=ResFinalVars.lines_number[3];
  249. break;
  250. caseResFinalVars.LINE5:
  251. ret+=ResFinalVars.lines_number[4];
  252. break;
  253. caseResFinalVars.LINE8:
  254. ret+=ResFinalVars.lines_number[7];
  255. break;
  256. caseResFinalVars.LINEGF:
  257. ret+=ResFinalVars.lines_number[8];
  258. break;
  259. }
  260. returnret;
  261. }
  262. /**processpath*/
  263. publicvoidmakePathPrompt(){
  264. Stringret="最短路线:",linenum="";
  265. inti,id=beginVertex,previd,nextid,cnt=0;
  266. //clearpathhistory
  267. mPath.clear();
  268. //findthepath
  269. findPath(this.getEndVertexId());
  270. if(mPath.size()==1)//beginVertex==endVertex
  271. {
  272. ret="您已经在"+findStrById(id)+"了,无需乘坐地铁";
  273. mResult=ret;
  274. return;
  275. }
  276. for(i=0;i<mPath.size();i++)
  277. {
  278. id=mPath.get(i);
  279. if(i==0)//id==beginVertex
  280. {
  281. nextid=mPath.get(i+1);
  282. linenum=getLineInfo(graph[id].getLine()&graph[nextid].getLine());
  283. ret+="在"+findStrById(id)+"乘坐"+linenum;
  284. }
  285. elseif(i==mPath.size()-1)//id==endVertex
  286. {
  287. cnt++;
  288. ret+="(坐"+cnt+"站)到"+findStrById(id)+"下车";
  289. }
  290. elseif(graph[id].getInfo()==ResFinalVars.NORMAL)
  291. {
  292. cnt++;
  293. }
  294. elseif(graph[id].getInfo()==ResFinalVars.TRANSIT)
  295. {
  296. cnt++;
  297. if(i+1<mPath.size())//makesure(i+1)notoverflow
  298. {
  299. previd=mPath.get(i-1);
  300. nextid=mPath.get(i+1);
  301. linenum=getLineInfo(graph[id].getLine()&graph[nextid].getLine());
  302. if((graph[previd].getLine()&graph[id].getLine())!=(graph[nextid].getLine()&graph[id].getLine()))
  303. {
  304. ret+="(坐"+cnt+"站)"+"到"+findStrById(id)+"换乘"+linenum;
  305. cnt=0;
  306. }
  307. }
  308. }
  309. }
  310. mResult=ret;
  311. }
  312. /**getresult*/
  313. publicStringgetResult(){
  314. returnmResult;
  315. }
  316. }

Activity类:

        
  1. publicclassMetroSearchextendsActivity{
  2. privateSpinnermSpinnerBeginStation,mSpinnerEndStation;
  3. privateArrayAdapter<String>mAdapterStations;
  4. privateTextViewmTextView;
  5. privateButtonmSearch,mShowMap;
  6. privatePathSearchmPathSearch;
  7. privateStringmStationNames[];
  8. publicintmBeginStation;
  9. publicintmEndStation;
  10. publicvoiddoLineSearch(){
  11. Stringstr;
  12. mPathSearch.setBeginVertex(mBeginStation);
  13. mPathSearch.setEndVertex(mEndStation);
  14. mPathSearch.startSearch();
  15. mPathSearch.makePathPrompt();
  16. str=mPathSearch.getResult();
  17. mTextView.setText(str);
  18. }
  19. /**Calledwhentheactivityisfirstcreated.*/
  20. @Override
  21. publicvoidonCreate(BundlesavedInstanceState){
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.main);
  24. mPathSearch=newPathSearch();
  25. mTextView=(TextView)findViewById(R.id.result);
  26. mStationNames=newString[mPathSearch.getVertexNum()];
  27. for(inti=0;i<mPathSearch.getVertexNum();i++)
  28. {
  29. mStationNames[i]=mPathSearch.findStrById(i);
  30. }
  31. mAdapterStations=newArrayAdapter<String>(this,android.R.layout.simple_spinner_item,mStationNames);
  32. mAdapterStations.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
  33. mSpinnerBeginStation=(Spinner)findViewById(R.id.station_from);
  34. mSpinnerBeginStation.setAdapter(mAdapterStations);
  35. mSpinnerEndStation=(Spinner)findViewById(R.id.station_to);
  36. mSpinnerEndStation.setAdapter(mAdapterStations);
  37. /*
  38. classOnItemSelectedListenerBeginStationimplementsOnItemSelectedListener{
  39. publicvoidonItemSelected(AdapterView<?>parent,Viewview,intpos,longid){
  40. mBeginStation=pos;
  41. }
  42. publicvoidonNothingSelected(AdapterViewparent){
  43. //Donothing.
  44. }
  45. }
  46. classOnItemSelectedListenerEndStationimplementsOnItemSelectedListener{
  47. publicvoidonItemSelected(AdapterView<?>parent,Viewview,intpos,longid){
  48. mEndStation=pos;
  49. }
  50. publicvoidonNothingSelected(AdapterViewparent){
  51. //Donothing.
  52. }
  53. }
  54. mSpinnerBeginStation.setOnItemSelectedListener(newOnItemSelectedListenerBeginStation());
  55. mSpinnerEndStation.setOnItemSelectedListener(newOnItemSelectedListenerEndStation());
  56. */
  57. //thisisthebettercodethanthat
  58. classOnSpinnerItemSelectedListenerimplementsOnItemSelectedListener{
  59. publicvoidonItemSelected(AdapterView<?>parent,Viewview,intpos,longid){
  60. switch(parent.getId())//attention:shouldnotbeview.getId()
  61. {
  62. caseR.id.station_from:
  63. mBeginStation=pos;
  64. break;
  65. caseR.id.station_to:
  66. mEndStation=pos;
  67. break;
  68. default:
  69. Log.d("xiaoben","viewidnotmatch");
  70. break;
  71. }
  72. }
  73. publicvoidonNothingSelected(AdapterViewparent){
  74. //Donothing.
  75. }
  76. }
  77. mSpinnerBeginStation.setOnItemSelectedListener(newOnSpinnerItemSelectedListener());
  78. mSpinnerEndStation.setOnItemSelectedListener(newOnSpinnerItemSelectedListener());
  79. /*button*/
  80. mSearch=(Button)findViewById(R.id.search_btn);
  81. mSearch.setOnClickListener(newView.OnClickListener(){
  82. publicvoidonClick(Viewv){
  83. //Performactiononclick
  84. doLineSearch();
  85. }
  86. });
  87. mShowMap=(Button)findViewById(R.id.map_btn);
  88. mShowMap.setOnClickListener(newView.OnClickListener(){
  89. @Override
  90. publicvoidonClick(Viewv){
  91. //TODOAuto-generatedmethodstub
  92. Intentintent=newIntent();
  93. intent.setClass(MetroSearch.this,MapDisplay.class);
  94. startActivity(intent);
  95. }
  96. });
  97. }
  98. }

更多相关文章

  1. Android学习路线-mars
  2. Android学习路线:如何成长为高级工程师
  3. Android 开启之旅-学习路线
  4. Android推荐学习路线图,职业规划
  5. 通过Android上的意图启动Google地图路线
  6. Android游戏与应用开发最佳学习路线图
  7. Android学习路线(五)开启另一个Activity

随机推荐

  1. 【Android】Retrofit 的一些笔记
  2. Android(安卓)开发中uboot传给Kernel 的a
  3. 使用fiddler抓包手机请求数据
  4. Android实现侧滑菜单
  5. Android(安卓)targetSdkVersion 从22提到
  6. android多图拼接长图并合理显示
  7. Android(安卓)7.1 WebView 实现方式选择
  8. mac下使用android studio,解决无法打开问
  9. android获取监听SD Card状态的方法
  10. OkHttp的初步使用(get、post之{RequestBo