package beihang; import java.io.*; import java.util.*; public class getStation { static class Line { int id; String name; List stations = new ArrayList(); } public static class Station { String name; boolean visited; String preStation; List lineNow = new ArrayList(); List nextStation = new ArrayList(); } static List lines = new ArrayList(); static List stations = new ArrayList(); static HashMap map = new HashMap<>(); public static void getStationByLine(String name, String fileOut) { List ans = new ArrayList(); for (Line line : lines) { if (line.name.equals(name)) { ans = line.stations; break; } } try { FileWriter fileWriter = new FileWriter(fileOut); int index = 0; for (String station : ans) { if (index == 0) { fileWriter.write(station); index = 1; } else { fileWriter.write("->" + station); } } fileWriter.flush(); fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } System.out.println(); return; } } 2.因为有要求进行最短路线操作,而我采用的是BFS函数,代码如下: package beihang; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Queue; import beihang.getStation.Station; import beihang.getStation.*; public class BFS { public static void BFS(String st, String ed) { for (Map.Entry entry : getStation.map.entrySet()) { entry.getValue().visited = false; } Queue queue = new LinkedList<>(); queue.add(st); while(!queue.isEmpty()) { String now = queue.poll(); getStation.map.get(now).visited = true; if(now.equals(ed)) { break; } for(Station station : getStation.map.get(now).nextStation) { if( getStation.map.get(station.name).visited==false) { getStation.map.get(station.name).preStation = now; queue.add(station.name); } } } } public static void printPath(String st, String ed, String fileOut) { List list = new ArrayList<>(); String now = ed; int flag = 0; String preLine = ""; while(!now.equals(st)) { list.add(now); now = getStation.map.get(now).preStation; } Collections.reverse(list); try { FileWriter fileWriter = new FileWriter(fileOut); fileWriter.write(list.size() + " "); fileWriter.write(st); for(int i = 0; i < list.size(); i++) { flag = 0; if( getStation.map.get(list.get(i)).lineNow.size()==1) { fileWriter.write("->" + list.get(i)); } else { int j; for(j = i+1; j < list.size(); j++) { if( getStation.map.get(list.get(j)).lineNow.size()==1) { if(! getStation.map.get(list.get(i)).lineNow.get(0).contains( getStation.map.get(list.get(j)).lineNow.get(0))) { if(preLine.equals( getStation.map.get(list.get(j)).lineNow.get(0))) { fileWriter.write("->" + list.get(i)); } else { fileWriter.write(" "); fileWriter.write( getStation.map.get(list.get(j)).lineNow.get(0) + " "); preLine = getStation.map.get(list.get(j)).lineNow.get(0); fileWriter.write(list.get(i)); } } break; } } } } fileWriter.flush(); fileWriter.close(); } catch (IOException e) { e.printStackTrace(); } } } 3.最后就是主函数,负责读入txt文件与输出txt文件,同时做一下站点的判断: package beihang; 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 beihang.getStation.Line; import beihang.getStation.Station; public class Subway { public void getSubwayMessage(String fileIn) { try { int cnt = 1; String path = fileIn; BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(path)),"UTF-8")); String getLine = null; while ((getLine = bufferedReader.readLine()) != null) { Line line = new Line(); String[] list = getLine.split(" "); line.id = cnt; line.name = list[0]; for(int i = 1; i < list.length-1; i++) { Station station1 = new Station(); Station station2 = new Station(); if(getStation.map.containsKey(list[i])) { station1 = getStation.map.get(list[i]); getStation.map.remove(list[i]); } else { station1.name = list[i]; station1.visited = false; } if(getStation.map.containsKey(list[i+1])) { station2 = getStation.map.get(list[i+1]); getStation.map.remove(list[i+1]); } else { station2.name = list[i+1]; station2.visited = false; } if(!station1.lineNow.contains(line.name)) { station1.lineNow.add(line.name); } if(!station2.lineNow.contains(line.name)) { station2.lineNow.add(line.name); } if(!station1.nextStation.contains(station2)) { station1.nextStation.add(station2); } if(!station2.nextStation.contains(station1)) { station2.nextStation.add(station1); } station1.preStation = station1.name; station2.preStation = station2.name; getStation.map.put(list[i], station1); getStation.map.put(list[i+1], station2); if (!line.stations.contains(station1.name)) { line.stations.add(station1.name); } if (!line.stations.contains(station2.name)) { line.stations.add(station2.name); } } getStation.lines.add(line); cnt++; } bufferedReader.close(); } catch (Exception e) { System.err.println("read errors: " + e); } return ; } public static void main(String[] args) { Subway solve = new Subway(); String fileIn = ""; String fileOut = ""; String line = ""; String start = ""; String end = ""; for(String s:args) { System.out.print(s); } for(int i = 0; i < args.length; i++){ if(args[i].equals("-map")) { i++; fileIn = args[i]; } if(args[i].equals("-a")) { i++; line = args[i]; } if(args[i].equals("-o")) { i++; fileOut = args[i]; } if(args[i].equals("-b")) { i++; start = args[i]; i++; end = args[i]; } } if(args.length==2) { solve.getSubwayMessage(fileIn); System.out.println("读入的地铁信息如下:"); for(Line line1 : getStation.lines) { System.out.print(line1.name + ":"); for(String s : line1.stations) { System.out.print(" " + s); } System.out.println(); } } else if(args.length==6) { solve.getSubwayMessage(fileIn); int flag = 0; for(Line line1 : getStation.lines) { if(line1.name.equals(line)) { flag = 1; } } if(flag==1) { getStation.getStationByLine(line, fileOut); System.out.println("Successfully output all site results on the route to " + fileOut); } else { System.out.println("北京地铁线路中不存在'" + line + "'线路"); } } else if(args.length==7) { solve.getSubwayMessage(fileIn); int flag1 = 0; int flag2 = 0; for(Line line1 : getStation.lines) { if (line1.stations.contains(start)) { flag1 = 1; } } for(Line line1 : getStation.lines) { if (line1.stations.contains(end)) { flag2 = 1; } } if(flag1==1 && flag2==1) { BFS.BFS(start, end); BFS.printPath(start, end, fileOut); } if(flag1==0) { System.out.println("北京地铁线路中不存在'" + start + "'站点"); } if(flag2==0) { System.out.println("北京地铁线路中不存在'" + end + "'站点"); } } } }