公交线路查询

来源:互联网 发布:国际地面专线 知乎 编辑:程序博客网 时间:2024/04/27 22:09

 /**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 0
原创粉丝点击