这是我之前做的一个广州地铁地铁最短路线换乘查询的android应用程序。实现了最短路线换乘查询和优化过的查询结果。

其中难点有3:一是用图这个数据结构来构建整个地铁站点图;二是最短路径算法;三是查询结果的优化。

特点:资源与算法核心高度分离,随时可以更新地铁的线路和站点信息,而不用更改算法等其它部分。自动生成图, 数据更新方便,移植性强,可重用性高

1.  程序框架

MetroSearch:主Activity,提供线路查询功能。
MapDisplay: 副Activity,提供地铁图线路浏览功能。(附加功能)
PathSearch:地铁线路查询的核心类,包括了地铁图的数据结构描述,算法实现,最短路径描述等功能。
ResFinalVars:资源类,包括了地铁线路信息。
GraphEntry:邻接表类, 用于表示地铁线路图的数据结构。
TableEntry:用于记录最短路径,用于路径描述。
 

2. 地铁线路的数据结构描述

第一步:将地铁站点表示为数字编号,便于处理
方法:采用Hash表来存储地铁站点名字和数字编号的映射关系
优点:自动编号,搜索速度快

第二步:采用邻接表来构建图数据结构,资源数据与方法分开
方法:采用GraphEntry这个类来构建,其中图的构建全部是根据资源类ResFinalVars来自动生成图。
特点:所有地铁信息的改动,只需要在ResFinalVars修改就可以了,其它的地方一律不用改变。
优点:自动生成图,数据更新方便,移植性强,可重用性高

3. 查询结果处理与优化

GraphEntry类
class GraphEntry {
 private ArrayList<Integer> list;
 private int line;
 private int info;
 …
}

成员line保存着地铁线路号,如一号线,二号线。采用位域来表示,可以保存多条路线信息,且节省空间。(int型可以保存最多32条路线信息)
成员info保存着是普通站还是换乘站的信息,方便快速判断

 4. 代码实现(后续在:http://helloxiaoben.blog.51cto.com/5413531/929002)

资源类:

  1. /*  
  2.  * Author:  shenjunyong  
  3.  * E-mail:  junyong.shen@samsung.com  
  4.  * Date:    2012.6.14  
  5.  * */ 
  6. package com.xiaoben.metrosearch2;  
  7.  
  8. import android.app.Activity;  
  9. import android.content.Intent;  
  10. import android.os.Bundle;  
  11. import android.util.Log;  
  12. import android.view.View;  
  13. import android.widget.AdapterView;  
  14. import android.widget.ArrayAdapter;  
  15. import android.widget.Button;  
  16. import android.widget.Spinner;  
  17. import android.widget.TextView;  
  18. import android.widget.AdapterView.OnItemSelectedListener;  
  19. import java.util.*;  
  20.  
  21. final class ResFinalVars{  
  22.     public static final int INFINITE = 0xffff;  
  23.     public static final int UNKNOWN = -1;  
  24.     public static final int TRANSIT = 0;  
  25.     public static final int NORMAL = 1;  
  26.       
  27.     public static enum LINESINFO{  
  28.         LINE1(1), LINE2(2), LINE3(4), LINE4(8), LINE5(0x10), LINE6(0x20), LINE7(0x40), LINE8(0x80), LINEGF(0x100);        
  29.         private final int value;  
  30.         private LINESINFO(int value){  
  31.             this.value = value;  
  32.         }  
  33.           
  34.         public int getValue(){  
  35.             return this.value;  
  36.         }  
  37.     };  
  38.       
  39.     public static final int LINE1 = 1;  
  40.     public static final int LINE2 = 2;  
  41.     public static final int LINE3 = 4;  
  42.     public static final int LINE4 = 8;  
  43.     public static final int LINE5 = 0x10;  
  44.     public static final int LINE6 = 0x20;  
  45.     public static final int LINE7 = 0x40;  
  46.     public static final int LINE8 = 0x80;  
  47.     public static final int LINEGF = 0x100;  
  48.       
  49.       
  50.       
  51.     public static final String[] lines_number = {  
  52.         "地铁一号线", "地铁二号线", "地铁三号线", "地铁四号线", "地铁五号线", "", "", "地铁八号线", "地铁广佛线" 
  53.     };  
  54.       
  55.     public static final String line1_stations[] = {  
  56.         "广州东站", "体育中心", "体育西路", "杨箕", "东山口", "烈士陵园", "农讲所", "公园前", "西门口", "陈家祠", "长寿路", "黄沙", "芳村", "花地湾", "坑口", "西朗",  
  57.     };      
  58.  
  59.     public static final String line2_stations[] = {  
  60.         "广州南站", "石壁", "会江", "南浦", "洛溪", "南洲", "东晓南", "江泰路", "昌岗", "江南西", "市二宫", "海珠广场", "公园前", "纪念堂", "越秀公园", "广州火车站", "三元里", "飞翔公园", "白云公园", "白云文化广场", "萧岗", "江夏", "黄边", "嘉禾望岗",  
  61.     };    
  62.  
  63.     public static final String line3a_stations[] = {  
  64.         "天河客运站", "五山", "华师", "岗顶", "石牌桥", "体育西路", "珠江新城", "赤岗塔", "客村", "大塘", "沥滘", "厦滘", "大石", "汉溪长隆", "市桥", "番禺广场" 
  65.     };    
  66.  
  67.     public static final String line3b_stations[] = {  
  68.         "体育西路", "林和西", "广州东站", "燕塘", "梅花园", "京溪南方医院", "同和", "永泰", "白云大道北", "嘉禾望岗", "龙归", "人和", "机场南站",  
  69.     };  
  70.  
  71.  
  72.     public static final String line4_stations[] = {  
  73.         "黄村", "车陂", "车陂南", "万胜围", "官洲", "大学城北", "大学城南", "新造", "石碁", "海傍", "低涌", "东涌", "黄阁汽车城", "黄阁", "蕉门", "金洲",  
  74.     };      
  75.  
  76.     public static final String line5_stations[] = {  
  77.         "滘口", "坦尾", "中山八", "西场", "西村", "广州火车站", "小北", "淘金", "区庄", "动物园", "杨箕", "五羊邨", "珠江新城", "猎德", "潭村", "员村", "科韵路", "车陂南", "东圃", "三溪", "鱼珠", "大沙地", "大沙东", "文冲",  
  78.     };  
  79.  
  80.     public static final String line6_stations[] = {  
  81.           
  82.     };  
  83.               
  84.     public static final String line7_stations[] = {  
  85.     };  
  86.  
  87.     public static final String line8_stations[] = {  
  88.         "万胜围", "琶洲", "新港东", "磨碟沙", "赤岗", "客村", "鹭江", "中大", "晓港", "昌岗", "宝岗大道", "沙园", "凤凰新村",  
  89.     };  
  90.       
  91.     public static final String gfline_stations[] = {  
  92.         "西朗", "菊树", "龙溪", "金融高新区", "千灯湖", "(虫雷)岗", "南桂路", "桂城", "朝安", "普君北路", "祖庙", "同济路", "季华园", "魁奇路站" 
  93.     };  
  94.       
  95.     public static final String[][] lines = {  
  96.         line1_stations,  
  97.         line2_stations,  
  98.         line3a_stations,  
  99.         line3b_stations,  
  100.         line4_stations,  
  101.         line5_stations,  
  102.         line8_stations,  
  103.         gfline_stations,  
  104.     };  
  105.       
  106.     public static final String[] transit_stations = {  
  107.         "西朗", "广州东站", "万胜围", "客村", "昌岗", "车陂南", "珠江新城", "体育西路", "杨箕", "公园前", "广州火车站", "嘉禾望岗"   
  108.     };  
  109. }  

后续 代码:http://helloxiaoben.blog.51cto.com/5413531/929002