代码已上传至github:https://github.com/SilenceBoom/TheShortestPath.git
1.主要功能
- 将地铁线路保存成一个可读入,简洁明了的文本
- 程序能正确读入这个文件,并获取地铁线路信息
- 程序能正确处理输入的命令行
- 程序能正确输出指定地铁线经过的站点
- 程序能正确输出两个站点间的最短路径(未完全实现)
- 程序要有健壮性,能通过各类性能测试
2.实现语言
java
3.实现算法
Dijkstra算法
4.类职责划分
| Station.java | 储存站的信息 |
| Line.java | 储存线路信息 |
| TheShortestPath.java | 主程序 |
5.核心代码
public class Line { private String name;//线路名 private ArrayList<Station> stations =new ArrayList<Station>(); private int size; public Line() { } public void addStation(Station station) { stations.add(station); size++; } public void setName(String name) { this.name=name; } public String getName() { return name; } public Station getStation(int index) { return stations.get(index); } public ArrayList<Station> getLine(){ return stations; } public int getSize() { return size; } }
public class Station{ private String name;//站名 private List<String> line = new ArrayList<String>();//所在的线路 private List<Station> linkStation =new ArrayList<Station>();//前后站 public Station(){ } public Station(String name,List<String> line,List<Station> linkStation) { this.name=name; this.line=line; this.linkStation=linkStation; } public String getName() { return name; } public void setName(String name) { this.name = name; } public void addLine(String name) { line.add(name); } public String getLineName(int index) { return line.get(index); } public List<String> getLine(){ return line; } public void setLine(String name) { line.add(name); } public List<Station> getLinkStation() { return linkStation; } public void setLinkStation(List<Station> linkStation) { this.linkStation = linkStation; } public void addLinkStation(Station station) { linkStation.add(station); } }
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class TheShortestPath { public static void main(String[] args) throws IOException{ String path="地铁线路信息.txt"; File f =new File(path); Scanner input=new Scanner(System.in); ArrayList<Line> map = new ArrayList();//所有线路及站 ArrayList<Station> all=new ArrayList();//所有站,不重复 try { BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f),"UTF-8")); String str=null; while((str=br.readLine())!=null) { String[] st=str.split(" "); Line line=new Line(); line.setName(st[0]); for(int i=1;i<st.length;i++) { Station station=new Station(); station.addLine(st[0]); station.setName(st[i]); line.addStation(station); } map.add(line); } for(int i=0;i<map.size();i++) { for(Station j:map.get(i).getLine()) { int n=0; for(n=0;n<all.size();n++) { if((all.get(n).getName()).compareTo(j.getName())==0) { all.get(n).addLine(j.getLineName(0)); break; } } if(n>=all.size()) { all.add(j); } } } // for(int i=0;i<all.size();i++) { // System.out.println(all.get(i).getName()); // for(String n:all.get(i).getLine()) { // System.out.print(n+" "); // } // System.out.println(); // } br.close(); }catch(Exception e) { e.printStackTrace(); } System.out.print("请输入起始站(或地铁线):"); String start=input.next(); boolean isPath=true; for(int i=0;i<map.size();i++) { if(map.get(i).getName().compareTo(start)==0) { isPath=false; for(int j=0;j<map.get(i).getSize();j++) { System.out.print(map.get(i).getStation(j).getName()+" "); } } } if(isPath) { System.out.print("请输入终点站:"); String end=input.next(); Shortest(start,end,all,map); } } public static void Shortest(String start,String end,ArrayList<Station> all,ArrayList<Line> map) { Station startStation =new Station(); Station endStation =new Station(); boolean isSame=false; String lineName=" "; int line=-1; //获取两个站的信息 for(int i=0;i<all.size();i++) { if((all.get(i).getName()).compareTo(start)==0) { startStation=all.get(i); } else if((all.get(i).getName()).compareTo(end)==0) { endStation=all.get(i); } } //判断是否从属一条线 for(String i:startStation.getLine()) { if(endStation.getLine().contains(i)) { isSame=true; lineName=i; } } if(isSame) { for(int i=0;i<map.size();i++) { if(map.get(i).getName().compareTo(lineName)==0) { line=i; } } int isOut=-1; for(Station i:map.get(line).getLine()) { if(i.getName().compareTo(start)==0||i.getName().compareTo(end)==0) { System.out.print(i.getName()+" "); isOut=-isOut; } else if(isOut==1) { System.out.print(i.getName()+" "); } } } else { int linestart=0; int lineend=0; String lineS=" "; String lineE=" "; for(int i=0;i<map.size();i++) { if(startStation.getLine().contains(map.get(i).getName())) { linestart=i; lineS=map.get(i).getName(); } else if(endStation.getLine().contains(map.get(i).getName())) { lineend=i; lineE=map.get(i).getName(); } } //换乘站 int isOut=-1; int change=0; for(int i=0;i<map.get(linestart).getSize();i++) { if(map.get(linestart).getStation(i).getName().compareTo(start)==0) { isOut=-isOut; } if(map.get(linestart).getStation(i).getLine().contains(lineE)) { change=i; break; } if(isOut==1) System.out.print(map.get(linestart).getStation(i).getName()+" "); } System.out.print(" (此处换乘"+lineE+")"); isOut=-isOut; for(int i=0;i<map.get(lineend).getSize();i++) { if(map.get(linestart).getStation(change).getName().compareTo(map.get(lineend).getStation(i).getName())==0) { isOut=-isOut; } if(isOut==1) { System.out.print(map.get(lineend).getStation(i).getName()+" "); } if(map.get(lineend).getStation(i).getName().compareTo(end)==0) { isOut=-isOut; } } } } }
6.测试用例


7.总结
Dijkstra算法运用起来还是有点难....还需要再完善很多很多....


浙公网安备 33010602011771号