[博客园]https://www.cnblogs.com/yuqiang31701023/
[GitHub]https://github.com/yuqiang1999/Subway
本次个人项目,我选择实现的编程语言是java,采用了eclipse编程工具实现。程序通过读取csv的数据文件来获得地铁线路数据,实现了地铁线路和站点的查询以及两站点之间最短路径的输出。
| Personal Software Process Stages | 时间 |
|---|---|
| 数据格式设计、数据输入 | 5h |
| 类构件 | 1h |
| ui设计实现 | 2h |
| 功能实现 | 12h |
| 代码测试 | 2h |
| 总结分析 | 1h |
| 合计 | 23h |
'''
public class FloydInGraph {
private static int INF=Integer.MAX_VALUE; private int[][] dist; private int[][] path; private List<Integer> result=new ArrayList<Integer>(); public FloydInGraph(int size){ //构造函数 this.path=new int[size][size]; this.dist=new int[size][size]; } public static void outPutroute(String start,String destination) { Subway s = new Subway(); s.CreateGraph(); int[][] matrix = s.getGraph(); int begin=s.getIndex(start); int end=s.getIndex(destination); FloydInGraph graph=new FloydInGraph(500); graph.findCheapestPath(begin,end,matrix); List<Integer> list=graph.result; System.out.println(s.getname(begin)+" to "+s.getname(end)); for(int i=0;i<list.size();i++) { System.out.print(s.getname(list.get(i))+" "); if(i>0 && i<list.size()-1) { String l1 = s.getline_name(s.getAllStation().get(s.getIndex(s.getname(list.get(i-1)))).getName(), s.getAllStation().get(s.getIndex(s.getname(list.get(i)))).getName()); String l2 = s.getline_name(s.getAllStation().get(s.getIndex(s.getname(list.get(i)))).getName(), s.getAllStation().get(s.getIndex(s.getname(list.get(i+1)))).getName()); if(!(l1.equals(l2))) { System.out.print("(换乘"+l2+") "); } } } System.out.println(); System.out.println("经过站点数:"+graph.dist[begin][end]); } public static String outroute(String start,String destination) { String route = ""; Subway s = new Subway(); s.CreateGraph(); int[][] matrix = s.getGraph(); int begin=s.getIndex(start); int end=s.getIndex(destination); FloydInGraph graph=new FloydInGraph(500); graph.findCheapestPath(begin,end,matrix); List<Integer> list=graph.result; route += s.getname(begin)+" to "+s.getname(end)+":"; route += '\n'; for(int i=0;i<list.size();i++) { route += s.getname(list.get(i)); if(i>0 && i<list.size()-1) { String l1 = s.getline_name(s.getAllStation().get(s.getIndex(s.getname(list.get(i-1)))).getName(), s.getAllStation().get(s.getIndex(s.getname(list.get(i)))).getName()); String l2 = s.getline_name(s.getAllStation().get(s.getIndex(s.getname(list.get(i)))).getName(), s.getAllStation().get(s.getIndex(s.getname(list.get(i+1)))).getName()); if(!(l1.equals(l2))) { route += "(换乘"+l2+") "; } } if(i<list.size()-1) route += "-->"; } route += '\n'; route += "经过站点数:"+graph.dist[begin][end]; return route; } public void findCheapestPath(int begin,int end,int[][] matrix){ floyd(matrix); result.add(begin); findPath(begin,end); result.add(end); } public void findPath(int i,int j){ int k=path[i][j]; if(k==-1)return; findPath(i,k); //递归 result.add(k); findPath(k,j); } public 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]!=500&& dist[k][j]!=500&& dist[i][k]+dist[k][j]<dist[i][j]){ dist[i][j]=dist[i][k]+dist[k][j]; path[i][j]=k; } } } } }
}
'''






本次项目的对于我最大的困难是数据的输入和图的建立。由于第一次读取csv数据,方法是从CSDN的一篇博文中学习的,加以修改运用。核心算法方面,重新学习了Floyd算法后,观摩优秀的代码后,得以实现。UI界面则是短学期的学习积累,对JSwing比较熟悉,因此较为简单的就可以实现。 这一次的个人项目让我知道自己所学的还是很少,一名程序员需要不停的学习他人的代码来更新自己的知识,不能坐井观天。继续努力吧。
来源:博客园
作者:31701023余强
链接:https://www.cnblogs.com/yuqiang31701023/p/11673965.html