本次作业我主要是参考了网上天津地铁的代码,我把txt文件按其格式改成了北京的。功能一和功能二经过修改后能够实现,功能三网上代码用邻接矩阵和弗洛伊德算法,我不会改,改了一些发现把功能改坏了,导致功能三没能良好实现
github https://github.com/wangwenbo31701081/subway
需求概要
1.需要存储地铁信息
2.设计读取地铁信息的命令行
3.需要能输出查询到目的地的所有途经的地铁站点
4.能够算出两个地点间最短路线
5.能够进行性能检测
模块介绍
1.文件subway.txt读取和数据读取 FileOperate.java FileOperateOp.java
2.换站转乘最短路径算法 FloydInGraph GetStation.java Relative.java
3.输入输出 Subway.java
输入格式
1.实现地铁线路的加载
-map subway.txt
//将存储在subway.txt文件里的地铁线路进行读取
2.实现查询指定线路所有站点
-a 地铁线路名称 -map subway.txt -o station.txt
3.实现查询指定两个站点间的最短路径
-b 起始站点 目的站点 -map subway.txt -o routine.txt
文件数据读入
class FileOperate {
public List getFile(String path){
List line = new ArrayList();
try {
File file = new File(path);
InputStream in = new FileInputStream(file);
Reader reader = new InputStreamReader(in, "utf-8");
BufferedReader br = new BufferedReader(reader);
String s;
while ((s = br.readLine()) != null) {
line.add(s);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
}
return line;
}
public ListgetFileSpecLine(String path1,int startNum,int endNum){ List return line; } public void writeFile(String line1,String path1){ try { FileWriter writer=new FileWriter(path1); BufferedWriter bw=new BufferedWriter(writer); bw.write(line1); bw.close(); }catch(Exception e){ e.printStackTrace(); } }line=new ArrayList(); for(int i=startNum;i ){ line.add(getFile(path1).get(i)); }
最短路径算法
class FloydInGraph {
private static int INF = Integer.MAX_VALUE;
//dist[i][j]=INF<==>i 和 j之间没有边
private int[][] dist;
//顶点i 到 j的最短路径长度,初值是i到j的边的权重
private int[][] path;
public int [] path1;
private List result = new ArrayList();
public List getPath(int num1,int num2) {
FloydInGraph graph = new FloydInGraph(15);
int i=0;
int[][] matrix =
/* {{INF, 30, INF, 10, 50}, {INF, INF, 60, INF, INF}, {INF, INF, INF, INF, INF}, {INF, INF, INF, INF, 30},
{50, INF, 40, INF, INF},};*/
{{INF,INF,2,4,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF},
{INF,INF,INF,INF,3,2,INF,INF,INF,INF,INF,INF,INF,INF,INF},
{INF,6,INF,INF,INF,INF,3,INF,INF,INF,INF,INF,INF,INF,INF},
{INF,INF,3,INF,INF,INF,INF,3,INF,INF,INF,INF,INF,INF,INF},
{INF,INF,INF,INF,INF,2,INF,INF,INF,INF,5,INF,INF,INF,INF},
{INF,INF,INF,INF,INF,INF,4,INF,4,INF,INF,INF,INF,INF,INF},
{INF,INF,INF,INF,INF,INF,INF,3,3,3,INF,INF,INF,INF,INF},
{ INF,INF,INF,INF,INF,INF,INF,INF,INF,3,INF,INF,INF,INF,INF},
{ INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,5,2,INF,INF,INF},
{ INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,1,INF,INF,INF},
{INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,4,INF,INF},
{INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,2},
{INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,1,INF},
{INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,1,INF,1},
{INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,INF,1,INF},};
int begin = num1;
int end = num2;
graph.findCheapestPath(begin, end, matrix);
List list = graph.result;
/* System.out.println(begin + " to " + end + ",the cheapest path is:");
System.out.println(list.toString());
System.out.println(graph.dist[begin][end]);*/
Iterator it=list.iterator();
/* while(it.hasNext()){
Object obj=it.next();
System.out.println(obj);
}*/
return list;
}
void findCheapestPath(int begin, int end, int[][] matrix) {
floyd(matrix);
result.add(begin);
findPath(begin, end);
result.add(end);
}
void findPath(int i, int j) {
int k = path[i][j];
if (k == -1) {
return;
}
findPath(i, k); //递归
result.add(k);
findPath(k, j);
}
void floyd(int[][] matrix) {
int size = matrix.length;
//initialize dist and path
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
path[i][j] = -1;
dist[i][j] = matrix[i][j];
}
}
for (int k = 0; k < size; k++) {
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
if (dist[i][k] != INF &&
dist[k][j] != INF &&
dist[i][k] + dist[k][j] < dist[i][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
path[i][j] = k;
}
}
}
}
}
public FloydInGraph(int size) {
this.path = new int[size][size];
this.dist = new int[size][size];
}
}
规定内容格式
public FileOperateOp(String str, String str1, String str2, String str3, String str4, String str5) {
if(str.equals("-a") && str4.equals("-o") && str2.equals("-map")){
char ch=str1.charAt(0);
switch(ch){
case '1' : {getFilePrint(str3,0);writeFile(getFile(str3).get(0),str5);break;}
case '2' : {getFilePrint(str3,1);writeFile(getFile(str3).get(1),str5);break;}
......
......
default:System.out.println("error");
}
}else{
System.out.println("command error!");
}
}
读入的文本文件(其中f代表普通站点,t代表转乘站点,站点间用空格分隔):
1号线: 苹果园 f 古城 f 八角游乐园 f 八宝山 f 玉泉路 f 五棵松 f 万寿路 f 公主坟 t 军事博物馆 t 木樨地 f 南礼士路 f 复兴门 t 西单 t 天安门西 f 天安门东 f 王府井 f 东单 t 建国门 t 永安里 f 国贸 t 大望路 t 四惠 t 四惠东 t
2号线: 积水潭 t 鼓楼大街 t 安定门 f 雍和宫 t 东直门 t 东四十条 f 朝阳门 t 建国门 t 北京站 f 崇文门 t 前门 f 和平门 f 宣武门 t 长椿街 f 复兴门 t 阜成门 f 车公庄 t 西直门 t 积水潭 t
4号线大兴线: 安河桥北 f 北宫门 f 西苑 t 圆明园 f 北京大学东门 f 中关村 f 海淀黄庄 t 人民大学 f 魏公村 f 国家图书馆 t 动物园 f 西直门 t 新街口 f 平安里 t 西四 f 灵境胡同 f 西单 t 宣武门 t 菜市口 t 陶然亭 f 北京南站 t 马家堡 f 角门西 t 公益西桥 f 新宫 f 西红门 f 高米店北 f 高米店南 f 枣园 f 清源路 f 黄村西大街 f 黄村火车站 f 义和庄 f 生物医药基地 f 天宫院 f
5号线: 天通苑北 f 天通苑 f 天通苑南 f 立水桥 t 立水桥南 f 北苑路北 f 大屯路东 t 惠新西街北口 f 惠新西街南口 t 和平西桥 f 和平里北桥 f 雍和宫 t 北新桥 f 张自忠路 f 东四 t 灯市口 f 东单 t 崇文门 t 磁器口 t 天坛东门 f 蒲黄榆 t 刘家窑 f 宋家庄 t
6号线: 金安桥 t 杨庄 f 西黄村 f 廖公庄 f 田村 f 海淀五路居 f 慈寿寺 t 花园桥 f 白石桥南 t 车公庄西 f 车公庄 t 平安里 t 北海北 f 南锣鼓巷 t 东四 t 朝阳门 t 东大桥 f 呼家楼 t 金台路 t 十里堡 f 青年路 f 褡裢坡 f 黄渠 f 常营 f 草房 f 物资学院路 f 通州北关 f 北运河西 f 北运河东 f 郝家府 f 东夏园 f 潞城 f
7号线: 北京西站 t 湾子 f 达官营 f 广安门内 f 菜市口 t 虎坊桥 f 珠市口 t 桥湾 f 磁器口 t 广渠门内 f 广渠门外 f 九龙山 t 大郊亭 f 百子湾 f 化工 f 南楼梓庄 f 欢乐谷景区 f 垡头 f 双合 f 焦化厂 f
8号线: 朱辛庄 t 育知路 f 平西府 f 回龙观东大街 f 霍营 t 育新 f 西小口 f 永泰庄 f 林萃桥 f 森林公园南门 f 奥林匹克公园 t 奥体中心 f 北土城 t 安华桥 f 安德里北街 f 鼓楼大街 t 什刹海 f 南锣鼓巷 t 中国美术馆 f 8号线南段: 珠市口 t 天桥 f 永定门外 t 木樨园 f 海户屯 f 大红门南 f 和义 f 东高地 f 火箭万源 f 五福堂 f 德茂 f 瀛海 f
9号线: 国家图书馆 t 白石桥南 t 白堆子 f 军事博物馆 t 北京西站 t 六里桥东 f 六里桥 t 七里庄 t 丰台东大街 f 丰台南路 f 科怡路 f 丰台科技园 f 郭公庄 t
10号线: 巴沟 t 苏州街 f 海淀黄庄 t 知春里 f 知春路 f 西土城 f 牡丹园 f 健德门 f 北土城 t 安贞门 f 惠新西街南口 t 芍药居 t 太阳宫 f 三元桥 t 亮马桥 f 农业展览馆 f 团结湖 f 呼家楼 t 金台夕照 f 国贸 t 双井 f 劲松 f 潘家园 f 十里河 t 分钟寺 f 成寿寺 f 宋家庄 t 石榴庄 f 大红门 f 角门东 f 角门西 t 草桥 t 纪家庙 f 首经贸 f 丰台站 f 泥洼 f 西局 t 六里桥 t 莲花桥 f 公主坟 t 西钓鱼台 f 慈寿寺 t 车道沟 f 长春桥 f 火器营 f 巴沟 t
13号线: 西直门 t 大钟寺 f 知春路 f 五道口 f 上地 f 西二旗 t 龙泽 f 回龙观 f 霍营 t 立水桥 t 北苑 f 望京西 t 芍药居 t 光熙门 f 柳芳 f 东直门 t
14号线西段: 张郭庄 f 园博园 f 大瓦窑 f 郭庄子 f 大井 f 七里庄 t 西局 t
14号线东段: 北京南站 t 永定门外 t 景泰 f 蒲黄榆 t 方庄 f 十里河 t 北工大西门 f 平乐园 f 九龙山 t 大望路 t 金台路 t 朝阳公园 f 枣营 f 东风北桥 f 将台 f 望京南 f 阜通 f 望京 t 东湖渠 f 来广营 f 善各庄 f
15号线: 清华东路西口 f 六道口 f 北沙滩 f 奥林匹克公园 t 安立路 f 大屯路东 t 关庄 f 望京西 t 望京 t 望京东 f 崔各庄 f 马泉营 f 孙河 f 国展 f 花梨坎 f 后沙峪 f 南法信 f 石门 f 顺义 f 俸伯 f
16号线: 北安河 f 温阳路 f 稻香湖路 f 屯佃 f 永丰 f 永丰南 f 西北旺 f 马连洼 f 农大南路 f 西苑 t
八通线: 四惠 t 四惠东 t 高碑店 f 传媒大学 f 双桥 f 管庄八里桥 f 通州北苑 f 果园 f 九棵树 f 梨园 f 临河里 f 北桥 f
昌平线: 昌平西山口 f 十三陵景区 f 昌平 f 昌平东关 f 北邵洼 f 南邵 f 沙河高教区 f 沙河 f 巩华城 f 朱辛庄 t 生命科学园 f 西二旗 t
亦庄线: 宋家庄 t 肖村 f 小红门 f 旧宫 f 亦庄桥 f 亦庄文化园 f 万源街 f 容京东街 f 荣昌东街 f 同济南路 f 经海路 f 次渠南 f 次渠 f 亦庄火车站 f
房山线: 郭公庄 t 大葆台 f 稻田 f 长阳 f 篱笆房 f 广阳城 f 良乡大学城北 f 良乡大学城 f 良乡大学城西 f 良乡南关 f 苏庄 f 阎村东 t
机场线: 东直门 t 三元桥 t T2/T3航站楼 f
s1线: 石厂 f 小园 f 栗园庄 f 上岸 f 桥户营 f 四道桥 f 金安桥 t
燕房线: 燕山 f 房山城关 f 饶乐府 f 马各庄 f 大石河东 f 星城 f 阎村 f 紫草坞 f 阎村东 t
西郊线: 香山 f 植物园 t 万安 f 茶棚 f 颐和园西门 f 巴沟 t
新机场线: 草桥 t 大兴新城 f 大兴机场 f
读入所有的地铁线路和地铁站点 -map
功能1
1号线: 苹果园 -> 古城 -> 八角游乐园 -> 八宝山 -> 玉泉路 -> 五棵松 -> 万寿路 -> 公主坟 -> 军事博物馆 -> 木樨地 -> 南礼士路 -> 复兴门 -> 西单 -> 天安门西 -> 天安门东 -> 王府井 -> 东单 -> 建国门 -> 永安里 -> 国贸 -> 大望路 -> 四惠 -> 四惠东 ->
2号线: 积水潭 -> 鼓楼大街 -> 安定门 -> 雍和宫 -> 东直门 -> 东四十条 -> 朝阳门 -> 建国门 -> 北京站 -> 崇文门 -> 前门 -> 和平门 -> 宣武门 -> 长椿街 -> 复兴门 -> 阜成门 -> 车公庄 -> 西直门 -> 积水潭 ->
4号线大兴线: 安河桥北 -> 北宫门 -> 西苑 -> 圆明园 -> 北京大学东门 -> 中关村 -> 海淀黄庄 -> 人民大学 -> 魏公村 -> 国家图书馆 -> 动物园 -> 西直门 -> 新街口 -> 平安里 -> 西四 -> 灵境胡同 -> 西单 -> 宣武门 -> 菜市口 -> 陶然亭 -> 北京南站 -> 马家堡 -> 角门西 -> 公益西桥 -> 新宫 -> 西红门 -> 高米店北 -> 高米店南 -> 枣园 -> 清源路 -> 黄村西大街 -> 黄村火车站 -> 义和庄 -> 生物医药基地 -> 天宫院 ->
5号线: 天通苑北 -> 天通苑 -> 天通苑南 -> 立水桥 -> 立水桥南 -> 北苑路北 -> 大屯路东 -> 惠新西街北口 -> 惠新西街南口 -> 和平西桥 -> 和平里北桥 -> 雍和宫 -> 北新桥 -> 张自忠路 -> 东四 -> 灯市口 -> 东单 -> 崇文门 -> 磁器口 -> 天坛东门 -> 蒲黄榆 -> 刘家窑 -> 宋家庄 ->
6号线: 金安桥 -> 杨庄 -> 西黄村 -> 廖公庄 -> 田村 -> 海淀五路居 -> 慈寿寺 -> 花园桥 -> 白石桥南 -> 车公庄西 -> 车公庄 -> 平安里 -> 北海北 -> 南锣鼓巷 -> 东四 -> 朝阳门 -> 东大桥 -> 呼家楼 -> 金台路 -> 十里堡 -> 青年路 -> 褡裢坡 -> 黄渠 -> 常营 -> 草房 -> 物资学院路 -> 通州北关 -> 北运河西 -> 北运河东 -> 郝家府 -> 东夏园 -> 潞城 ->
7号线: 北京西站 -> 湾子 -> 达官营 -> 广安门内 -> 菜市口 -> 虎坊桥 -> 珠市口 -> 桥湾 -> 磁器口 -> 广渠门内 -> 广渠门外 -> 九龙山 -> 大郊亭 -> 百子湾 -> 化工 -> 南楼梓庄 -> 欢乐谷景区 -> 垡头 -> 双合 -> 焦化厂 ->
8号线: 朱辛庄 -> 育知路 -> 平西府 -> 回龙观东大街 -> 霍营 -> 育新 -> 西小口 -> 永泰庄 -> 林萃桥 -> 森林公园南门 -> 奥林匹克公园 -> 奥体中心 -> 北土城 -> 安华桥 -> 安德里北街 -> 鼓楼大街 -> 什刹海 -> 南锣鼓巷 -> 中国美术馆 -> 8号线南段: 珠市口 -> 天桥 -> 永定门外 -> 木樨园 -> 海户屯 -> 大红门南 -> 和义 -> 东高地 -> 火箭万源 -> 五福堂 -> 德茂 -> 瀛海 ->
9号线: 国家图书馆 -> 白石桥南 -> 白堆子 -> 军事博物馆 -> 北京西站 -> 六里桥东 -> 六里桥 -> 七里庄 -> 丰台东大街 -> 丰台南路 -> 科怡路 -> 丰台科技园 -> 郭公庄 ->
10号线: 巴沟 -> 苏州街 -> 海淀黄庄 -> 知春里 -> 知春路 -> 西土城 -> 牡丹园 -> 健德门 -> 北土城 -> 安贞门 -> 惠新西街南口 -> 芍药居 -> 太阳宫 -> 三元桥 -> 亮马桥 -> 农业展览馆 -> 团结湖 -> 呼家楼 -> 金台夕照 -> 国贸 -> 双井 -> 劲松 -> 潘家园 -> 十里河 -> 分钟寺 -> 成寿寺 -> 宋家庄 -> 石榴庄 -> 大红门 -> 角门东 -> 角门西 -> 草桥 -> 纪家庙 -> 首经贸 -> 丰台站 -> 泥洼 -> 西局 -> 六里桥 -> 莲花桥 -> 公主坟 -> 西钓鱼台 -> 慈寿寺 -> 车道沟 -> 长春桥 -> 火器营 -> 巴沟 ->
13号线: 西直门 -> 大钟寺 -> 知春路 -> 五道口 -> 上地 -> 西二旗 -> 龙泽 -> 回龙观 -> 霍营 -> 立水桥 -> 北苑 -> 望京西 -> 芍药居 -> 光熙门 -> 柳芳 -> 东直门 ->
14号线西段: 张郭庄 -> 园博园 -> 大瓦窑 -> 郭庄子 -> 大井 -> 七里庄 -> 西局 ->
14号线东段: 北京南站 -> 永定门外 -> 景泰 -> 蒲黄榆 -> 方庄 -> 十里河 -> 北工大西门 -> 平乐园 -> 九龙山 -> 大望路 -> 金台路 -> 朝阳公园 -> 枣营 -> 东风北桥 -> 将台 -> 望京南 -> 阜通 -> 望京 -> 东湖渠 -> 来广营 -> 善各庄 ->
15号线: 清华东路西口 -> 六道口 -> 北沙滩 -> 奥林匹克公园 -> 安立路 -> 大屯路东 -> 关庄 -> 望京西 -> 望京 -> 望京东 -> 崔各庄 -> 马泉营 -> 孙河 -> 国展 -> 花梨坎 -> 后沙峪 -> 南法信 -> 石门 -> 顺义 -> 俸伯 ->
16号线: 北安河 -> 温阳路 -> 稻香湖路 -> 屯佃 -> 永丰 -> 永丰南 -> 西北旺 -> 马连洼 -> 农大南路 -> 西苑 ->
八通线: 四惠 -> 四惠东 -> 高碑店 -> 传媒大学 -> 双桥 -> 管庄八里桥 -> 通州北苑 -> 果园 -> 九棵树 -> 梨园 -> 临河里 -> 北桥 ->
昌平线: 昌平西山口 -> 十三陵景区 -> 昌平 -> 昌平东关 -> 北邵洼 -> 南邵 -> 沙河高教区 -> 沙河 -> 巩华城 -> 朱辛庄 -> 生命科学园 -> 西二旗 ->
亦庄线: 宋家庄 -> 肖村 -> 小红门 -> 旧宫 -> 亦庄桥 -> 亦庄文化园 -> 万源街 -> 容京东街 -> 荣昌东街 -> 同济南路 -> 经海路 -> 次渠南 -> 次渠 -> 亦庄火车站 ->
房山线: 郭公庄 -> 大葆台 -> 稻田 -> 长阳 -> 篱笆房 -> 广阳城 -> 良乡大学城北 -> 良乡大学城 -> 良乡大学城西 -> 良乡南关 -> 苏庄 -> 阎村东 ->
机场线: 东直门 -> 三元桥 -> T2/T3航站楼 ->
s1线: 石厂 -> 小园 -> 栗园庄 -> 上岸 -> 桥户营 -> 四道桥 -> 金安桥 ->
燕房线: 燕山 -> 房山城关 -> 饶乐府 -> 马各庄 -> 大石河东 -> 星城 -> 阎村 -> 紫草坞 -> 阎村东 ->
西郊线: 香山 -> 植物园 -> 万安 -> 茶棚 -> 颐和园西门 -> 巴沟 ->
新机场线: 草桥 -> 大兴新城 -> 大兴机场 ->
显示某一条线路的所有站点
-a", "2号线", "-map
功能2
2号线: 积水潭 -> 鼓楼大街 -> 安定门 -> 雍和宫 -> 东直门 -> 东四十条 -> 朝阳门 -> 建国门 -> 北京站 -> 崇文门 -> 前门 -> 和平门 -> 宣武门 -> 长椿街 -> 复兴门 -> 阜成门 -> 车公庄 -> 西直门 -> 积水潭 ->
-a", "6号线", "-map
功能2
6号线: 金安桥 -> 杨庄 -> 西黄村 -> 廖公庄 -> 田村 -> 海淀五路居 -> 慈寿寺 -> 花园桥 -> 白石桥南 -> 车公庄西 -> 车公庄 -> 平安里 -> 北海北 -> 南锣鼓巷 -> 东四 -> 朝阳门 -> 东大桥 -> 呼家楼 -> 金台路 -> 十里堡 -> 青年路 -> 褡裢坡 -> 黄渠 -> 常营 -> 草房 -> 物资学院路 -> 通州北关 -> 北运河西 -> 北运河东 -> 郝家府 -> 东夏园 -> 潞城 ->