公交線路查詢

 /**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();
	}
		
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章