地铁最短路径
1.主要功能:
计算指定两站之间最短(最少经过站数)乘车路线;输出指定地铁线路的所有站点。
以北京地铁为例,地铁线路信息保存在data.txt中。

保存在一份文本文档中,格式为:
地铁线路总数
线路名1 站名1 站名2 站名3 ...
线路名2 站名1 站名2 站名3 ...
线路名3 站名1 站名2 站名3 ......
目标1:计算指定两站之间最短(最少经过站数)乘车路线
目标2:输出指定地铁线路的所有站点
类职责划分
1、line类 :用于保存路线名和该路线上的所有站点
public class Line { private String name = ""; private ArrayList<String> stations =new ArrayList<>(); private int size; public String getname() { return name; } public void addStation(String station) { stations.add(station); size++; } public void setname(String name) { this.name = name; } public ArrayList<String> getStations() { return stations; } public int getSize() { return size; } }
2、station类 :用于储存各个站点的具体信息
public class Station { private String name = ""; private ArrayList<String> Line = new ArrayList<String>(); private ArrayList<Station> Linkstation = new ArrayList<Station>(); public int way; public Station pre; //存放最短路径的前驱节点 public Station(){ } public ArrayList<Station> getLinkstation() { return Linkstation; } public void addLinkstation(Station station) { Linkstation.add(station); } public String getname() { return name; } public void setname(String name) { name = name; } public void addLine(String line) { Line.add(line); } public void setLine(ArrayList<String> line) { Line = line; } public ArrayList<String> getLine() { return Line; } }
3、从文件中读取
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); String s = null; int j; Station prestation= new Station(); while ((s = br.readLine()) != null) { String tokens[]=s.split(" "); Line line = new Line(); line.setname(tokens[0]); for(int i=1;i<tokens.length;i++) { line.addStation(tokens[i]); for(j=0;j<stations.size();j++) { if(stations.get(j).getname().equals(tokens[i])) { stations.get(j).addLine(tokens[0]); if(i!=1) { stations.get(j).addLinkstation(prestation); prestation.addLinkstation(stations.get(j)); } prestation=stations.get(j); break; } Station station = new Station(); station.addLine(tokens[0]); station.setname(tokens[i]); } if(j==stations.size()) { Station station = new Station(); station.addLine(tokens[0]); station.setname(tokens[i]); station.way=10000; if(i!=1) { station.addLinkstation(prestation); prestation.addLinkstation(station); } stations.add(station); prestation=station; } } lines.add(line); }
4、所有代码
public class TestClass { public static void main(String[] args) { Scanner input=new Scanner(System.in); String temp="C:\\Users\\billy\\Desktop\\地铁线路信息.txt"; File file = new File(temp); ArrayList<Station> stations= new ArrayList<>(); ArrayList<Line> lines = new ArrayList<Line>(); try{ BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8")); String s = null; int j; Station prestation= new Station(); while ((s = br.readLine()) != null) { String tokens[]=s.split(" "); Line line = new Line(); line.setname(tokens[0]); for(int i=1;i<tokens.length;i++) { line.addStation(tokens[i]); for(j=0;j<stations.size();j++) { if(stations.get(j).getname().equals(tokens[i])) { stations.get(j).addLine(tokens[0]); if(i!=1) { stations.get(j).addLinkstation(prestation); prestation.addLinkstation(stations.get(j)); } prestation=stations.get(j); break; } Station station = new Station(); station.addLine(tokens[0]); station.setname(tokens[i]); } if(j==stations.size()) { Station station = new Station(); station.addLine(tokens[0]); station.setname(tokens[i]); station.way=10000; if(i!=1) { station.addLinkstation(prestation); prestation.addLinkstation(station); } stations.add(station); prestation=station; } } lines.add(line); } } catch (Exception e) { e.printStackTrace(); } System.out.print("1.查询最短路径 \n2.查询线路站点 "); int number=input.nextInt(); if(number==1){ System.out.print("起始站:"); String begin_station_name=input.next(); System.out.print("终点站:"); String end_station_name=input.next(); Station end_station = new Station(); Station begin_station = new Station(); for(Station station:stations) { if(station.getname().equals(begin_station_name)) { begin_station=station; Queue<Station> queue = new LinkedList<>(); station.way=0; queue.offer(station); while(!queue.isEmpty()) { Station vertex=queue.poll(); for(Station linkstation:vertex.getLinkstation()) { if(linkstation.way==10000) { linkstation.way=vertex.way+1; queue.offer(linkstation); linkstation.pre=vertex; } } } } if(station.getname().equals(end_station_name)) end_station=station; } ArrayList<Station> result=new ArrayList<>(); result(end_station,result); String changeLine=""; for(String i:result.get(0).getLine()) { if(result.get(1).getLine().contains(i)) { changeLine=i; break; } } for(int i=0;i<result.size();i++) { if(i>=2) { String line1=""; for(String t:result.get(i).getLine()) { if(result.get(i-1).getLine().contains(t)) { line1=t; break; } } if(!line1.equals(changeLine)) { for(String t:result.get(i).getLine()) { if(result.get(i-1).getLine().contains(t)) { changeLine=t; break; } } } } System.out.println(result.get(i).getname()); } } else if(number==2) { System.out.print("请输入线路名称:"); String line_name=input.next(); for(Line line:lines) { if(line.getname().equals(line_name)) { System.out.print(line.getStations().toString()); break; } } } else { System.out.print("输入有误"); } } public static void result(Station sta,ArrayList<Station> temp) { if(sta.pre!=null) result(sta.pre,temp); temp.add(sta); } }
第一个测试样例

第二个测试样例

第三个测试样例

总结
1.第一次用博客来写记录自己写的代码,有很多不懂的地方,需要提升写代码水平。
2.对于java语言我远不如c用的熟练,还需要提升。
浙公网安备 33010602011771号