/**1.輸入兩個站點,求兩個站點之間的站點數
* 2.換乘算兩個站(例如A-F,返回5)。換乘只考慮一次,不考慮多次換乘。
3.沒有乘車方案、異常返回-1;
4.反方向不算異常。即可以C-A,返回3。
5.公交線程存儲在busline1.txt文件中,見測試用例
* 該函數用於根據名字和狀態獲取指定的問題數量,只需要支持指定的四種狀態查詢即可
*
* @param pointA 出發點
* pointB 到達點
*
* @return 乘車所需站點個數。包括pointA、pointB本身
* 沒有乘車方案、異常返回-1
*/
public int getRide(String filePath, String pointA, String pointB) {
//!!!由於閱卷時會單獨執行本函數,因此確保函數能獨立讀文件,讀文件操作不要放到函數外!!!
//讀文件示例如下,可以自行修改
BufferedReader br = null;
int result = -1;
ArrayList<String> list = new ArrayList<String>();
String outString = "";
try {
br = new BufferedReader(new FileReader(filePath));
//TODO: Please add your code here!
String line = null;
while ((line = br.readLine())!= null) {
//process the line
//read next line
//line = br.readLine();
list.add(line);
outString = outString + line;
System.out.println("list.toString()="+list.toString());
}
} catch (Exception e) {
System.out.println("open file execption : " + e);
result = -1;
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
System.out.println("close file execption : " + e);
}
}
}
//如果不包含輸入的站點或線路條數爲0,直接返回
if(!outString.contains(pointA) || !outString.contains(pointB) || list.size()<=0){
return -1;
}
ArrayList<Integer> startLink = new ArrayList<Integer>();
ArrayList<Integer> endLine = new ArrayList<Integer>();
//總的線路
for(int i = 0;i<list.size();i++){
String [] point = list.get(i).split(" ");
System.out.println("Arrays.toString(point)="+Arrays.toString(point));
System.out.println("list.get(i)="+list.get(i));
//哪幾條線路包含查詢的站點,由於換乘只考慮一次,邏輯就簡單多了
if(list.get(i).contains(pointA)){
startLink.add(i);
}
if(list.get(i).contains(pointB)){
endLine.add(i);
}
}
//如果線路不包含輸入的站點直接返回
if(startLink.size()<=0 || endLine.size() <= 0){
return -1;
}
System.out.println("startLink.toString="+ startLink.toString());
System.out.println("endLine.toString=" + endLine.toString());
int startPoint = -1;
int endPoint = -1;
ArrayList<Integer> resultList = new ArrayList<Integer>();
for(int i = 0; i < startLink.size(); i++){
String [] startLinkPoint = list.get(startLink.get(i)).split(" ");
for(int j = 0; j< endLine.size(); j++){
String [] endLinePoint = list.get(endLine.get(j)).split(" ");
if(startLink.get(i) == endLine.get(j)){
for(int k = 0; k < startLinkPoint.length; k++){
if(pointA.equals(startLinkPoint[k])){
startPoint = k;
}
if(pointB.equals(startLinkPoint[k])){
endPoint = k;
}
}
resultList.add(Math.abs(startPoint-endPoint)+1);
startPoint = -1;
endPoint = -1;
}else{
int startSamePointIndex = -1;
int endSamePointIndex = -1;
for(int k = 0; k < startLinkPoint.length; k++){
if(pointA.equals(startLinkPoint[k])){
startPoint = k;
System.out.println("startPoint="+startPoint);
}
for(int n = 0; n < endLinePoint.length; n++){
if(pointB.equals(endLinePoint[n])){
endPoint = n;
System.out.println("endPoint="+endPoint);
}
if(startLinkPoint[k].equals(endLinePoint[n])){
startSamePointIndex = k;
endSamePointIndex = n;
System.out.println("startSamePointIndex=" + startSamePointIndex);
System.out.println("endSamePointIndex=" + endSamePointIndex);
}
}
System.out.println("startPoint-startSamePointIndex)="+Math.abs(startPoint-startSamePointIndex));
System.out.println("endPoint-endSamePointIndex="+ Math.abs(endPoint-endSamePointIndex));
if(startSamePointIndex != -1 && endSamePointIndex != -1){
resultList.add(Math.abs(startPoint-startSamePointIndex) + Math.abs(endPoint-endSamePointIndex) + 2);
startSamePointIndex = -1;
endSamePointIndex = -1;
}
}
}
}
}
//所有可能方案的排序,取最小值,所有可能的方案沒有考慮一條線上有相同站點,失敗一個用例可能是這個原因
Collections.sort(resultList);
System.out.println("resultList.toString="+resultList);
result = resultList.get(0);
return result;
}
public static void main(String[] args) {
JavaTest c = new JavaTest();
System.out.println("The ride number is:" + c.getRide("src/testcase/busline1.txt", "A", "C" ));
//JavaTestTest test = new JavaTestTest();
//test.test_Case1();
}
}