![]()
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() + "\r\n");
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("\r\n");
fileWriter.write( getStation.map.get(list.get(j)).lineNow.get(0) + "\r\n");
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 + "'站点");
}
}
}
}