公交线路查询

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


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值