结对作业7

完成地铁换乘的底层代码

复制代码
package subway.app.src.main.java.com.example.subway.util;

import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Dijkstra {
    public static int[][] weight=new int[com.example.subway.util.DataBuild.CanTransferStationList.size()+2][DataBuild.CanTransferStationList.size()+2];
    public static int weightl=DataBuild.CanTransferStationList.size()+2;
    //weight的顺序即CanTransferStationList列表的顺序  只有首尾占不在同一线上才用的到
    public static List<Station> result=new ArrayList<Station>();
    public static List<Integer> change=new ArrayList<Integer>();//放到达每个站的  前一个换乘站
    public static String resultstring=new String();
    private static int one=-1;
    public static Line inOneLine(Station x,Station y){
        int i;
        int j;
        one=-1;
        Line oneLine=new Line();
        int d=1000;
        for(i=0;i<x.getTansferLine().size();i++){//看他们是否再同一条线上 one
            for(j=0;j<y.getTansferLine().size();j++){
                if(x.getTansferLine().get(i)==y.getTansferLine().get(j)){
                    one=1;
                    oneLine=x.getTansferLine().get(i);
                    for(Station k:oneLine.getOneLineStation()){

                        if(k.getName().equals(x.getName())&&k.getInWhichLine()==oneLine&&Math.abs(k.getId()-y.getId())<d){
                            x=k;
                        }
                        if(k.getName().equals(y.getName())&&k.getInWhichLine()==oneLine&&Math.abs(x.getId()-k.getId())<d){
                            y=k;
                        }
                    }

                    if(Math.abs(x.getId()-y.getId())<d){
                        d=Math.abs(x.getId()-y.getId());
                    }
                }
            }
        }

        return oneLine;

    }
    private static int flagSizeOfW=0;
    public static void buildWeight(Station start,Station end){
        int s=0,e=0;

        if(flagSizeOfW==0){//首尾站均不可换乘
            s=1;e=1;
        }
        else if(flagSizeOfW==1){//仅首站均换乘
            e=1;
        }
        else if(flagSizeOfW==2){//仅尾站可换乘
            s=1;
        }
        else if(flagSizeOfW==3){//均可换乘
            s=0;e=0;
        }
        //System.out.println("s: "+s+ " e:"+e );
        for(int i=0;i<weightl;i++){
            for(int j=0;j<weight.length;j++)
                weight[i][j]=1000;

        }
        weight[0][0]=0;
        int i,j;
        //0号放start weightl-1号放end
        for(i=0+s;i<weightl-e;i++){

            weight[i][i]=0;
            for(j=i+1;j<DataBuild.CanTransferStationList.size();j++){//
                if(i==21&&j==55)
                {
                    weight[i][i]=0;
                }
                Line l1=inOneLine(DataBuild.CanTransferStationList.get(i),DataBuild.CanTransferStationList.get(j));
                if(one==1){
                    int index1=-1,index2=-1;
                    for(int k=0;k<l1.getOneLineStation().size();k++){//由站名 在l1中找出 该站
                        if(index1!=-1&&index2!=-1)
                            break;
                        if(l1.getOneLineStation().get(k).getName().equals(DataBuild.CanTransferStationList.get(i).getName())){
                            index1=k;
                        }
                        if(l1.getOneLineStation().get(k).getName().equals(DataBuild.CanTransferStationList.get(j).getName())){
                            index2=k;
                        }
                    }
                    if(l1.getIsCircle()){
                        weight[i+s][j+s]=weight[j+s][i+s]=Math.min(l1.getOneLineStation().size()-Math.abs(index1-index2),Math.abs(index1-index2));
                    }
                    else
                        weight[i+s][j+s]=weight[j+s][i+s]=Math.abs(index1-index2);

                }
            }
        }
        if(s==1){
            for(i=0;i<DataBuild.CanTransferStationList.size();i++){
                Line l1=inOneLine(start,DataBuild.CanTransferStationList.get(i));
                if(one==1){
                    int index1=-1,index2=-1;
                    for(j=0;j<l1.getOneLineStation().size();j++){
                        if(l1.getOneLineStation().get(j).getName().equals(DataBuild.CanTransferStationList.get(i).getName())){
                            index1=l1.getOneLineStation().get(j).getId();
                        }
                        if(l1.getOneLineStation().get(j).getName().equals(start.getName())){
                            index2=l1.getOneLineStation().get(j).getId();
                        }
                    }
                    if(l1.getIsCircle()){
                        weight[0][1+i]=weight[1+i][0]=Math.min(Math.abs(index1-index2),l1.getOneLineStation().size()-Math.abs(index1-index2));
                    }
                    else
                        weight[0][1+i]=weight[1+i][0]=Math.abs(index1-index2);
                }
            }

        }
        if(e==1){
            Line l1=inOneLine(end,DataBuild.CanTransferStationList.get(0));
            if(one==1){
                int index1=-1,index2=-1;
                for(j=0;j<l1.getOneLineStation().size();j++){
                    if(l1.getOneLineStation().get(j).getName().equals(DataBuild.CanTransferStationList.get(0).getName())){
                        index1=l1.getOneLineStation().get(j).getId();
                    }
                    if(l1.getOneLineStation().get(j).getName().equals(end.getName())){
                        index2=l1.getOneLineStation().get(j).getId();
                    }
                }
                if(l1.getIsCircle()){
                    weight[weightl-1][0]=weight[0][weightl-1]=Math.min(Math.abs(index1-index2),l1.getOneLineStation().size()-Math.abs(index1-index2));
                }
                else
                    weight[weightl-1][0]=weight[0][weightl-1]=Math.abs(index1-index2);
            }
            for(i=0;i<DataBuild.CanTransferStationList.size();i++){
                l1=inOneLine(end,DataBuild.CanTransferStationList.get(i));
                if(one==1){
                    int index1=-1,index2=-1;
                    for(j=0;j<l1.getOneLineStation().size();j++){
                        if(l1.getOneLineStation().get(j).getName().equals(DataBuild.CanTransferStationList.get(i).getName())){
                            index1=l1.getOneLineStation().get(j).getId();
                        }
                        if(l1.getOneLineStation().get(j).getName().equals(end.getName())){
                            index2=l1.getOneLineStation().get(j).getId();
                        }
                    }
                    if(l1.getIsCircle()){
                        weight[weightl-1][i+s]=weight[i+s][weightl-1]=Math.min(Math.abs(index1-index2),l1.getOneLineStation().size()-Math.abs(index1-index2));
                    }
                    else
                        weight[weightl-1][i+s]=weight[i+s][weightl-1]=Math.abs(index1-index2);

                }

            }
        }


    }

    public static void modiWeight(){
        for(int i=0;i<weightl;i++){
            change.add(-1);
        }
        int[] visited=new int[weightl];
        for(int v:visited)
            visited[v]=0;
        visited[0]=1;


        for(int i=0;i<weightl;i++){//每次循环 visited一个点
            int min=1000;
            int posi=0;
            for(int j=1;j<weightl;j++){
                if(visited[j]==0&&weight[0][j]<min){
                    min=weight[0][j];
                    posi=j;

                }

            }
            //System.out.println("选出1个最短:"+min+" posi:"+posi);
            visited[posi]=1;
            for(int j=0;j<weightl;j++){
                if(weight[0][posi]+weight[posi][j]<weight[0][j]&&j!=posi){
                    //System.out.println("原来:0到"+j+"是"+weight[0][j]);
                    //System.out.println("更新:0到"+j+weight[0][posi]+"+"+weight[posi][j]);
                    weight[0][j]=weight[0][posi]+weight[posi][j];

                    change.set(j, posi);
                }
            }
        }
    }
    public static void getTransfer(int e,Station es){//change
        //System.out.println(flagSizeOfW+"!");
        if(change.get(e)==-1){
            if(flagSizeOfW==3)
                result.add(DataBuild.CanTransferStationList.get(e));
            else if(flagSizeOfW==2)
                result.add(DataBuild.CanTransferStationList.get(e-1));
            else if(flagSizeOfW==1)
                result.add(DataBuild.CanTransferStationList.get(e));
            else{
                result.add(DataBuild.CanTransferStationList.get(e-1));
            }
            return;
        }

        if(flagSizeOfW==3){
            getTransfer(change.get(e),es);
            result.add(DataBuild.CanTransferStationList.get(e));
        }

        else if(flagSizeOfW==2){//尾可换
            getTransfer(change.get(e),es);
            result.add(DataBuild.CanTransferStationList.get(e-1));

        }
        else if(flagSizeOfW==1){//首可换
            getTransfer(change.get(e),es);
            if(e<55)
                result.add(DataBuild.CanTransferStationList.get(e));
            else result.add(es);
        }
        else if(flagSizeOfW==0){//都不可换乘
            getTransfer(change.get(e),es);
            if(e>0&&e<=56){
                result.add(DataBuild.CanTransferStationList.get(e-1));
            }
            else result.add(es);
        }
    }
    public static void getEveryStation(){
        Line ll2=new Line();
        for(int i=0;i<result.size()-1;i++){

            Line ll=inOneLine(result.get(i),result.get(i+1));

            int dis;
            int dir;
            for(int j=0;j<DataBuild.stationList.size();j++){
                if(DataBuild.stationList.get(j).getName().equals(result.get(i).getName())&&DataBuild.stationList.get(j).getInWhichLine().getName().equals(ll.getName())){
                    result.set(i,DataBuild.stationList.get(j) );
                }
                if(DataBuild.stationList.get(j).getName().equals(result.get(i+1).getName())&&DataBuild.stationList.get(j).getInWhichLine().getName().equals(ll.getName())){
                    result.set(i+1,DataBuild.stationList.get(j) );
                }
            }
            int index1=result.get(i).getId(),index2=result.get(i+1).getId();
            if(index1<index2)
                dir=1;
            else dir=-1;
            if(ll.getIsCircle()){
                dis=Math.min(Math.abs(index1-index2),ll.getOneLineStation().size()-Math.abs(index1-index2));
            }
            else
                dis=Math.abs(index1-index2);
            if(i!=0&&ll!=ll2){
                System.out.print("\n(此站需换乘到)"+ll.getName());
                resultstring+="\n(此站需换乘到)"+ll.getName();
            }
            else if(i==0){
                System.out.print("(乘坐)"+ll.getName());
                resultstring+="(乘坐)"+ll.getName();
            }

            ll2=ll;
            if(!ll.getIsCircle()){
                for(int j=0;j<dis;j++){
                    System.out.print(ll.getOneLineStation().get(index1+(dir)*j).getName()+"->");
                    resultstring+=ll.getOneLineStation().get(index1+(dir)*j).getName()+"->";
                }
                System.out.print(ll.getOneLineStation().get(index2).getName());
                resultstring+=ll.getOneLineStation().get(index2).getName();
            }
            else {//环线
                dis=Math.min(Math.abs(index1-index2), ll.getOneLineStation().size()-Math.abs(index1-index2));
                if(Math.abs(index1-index2)<=(ll.getOneLineStation().size()-Math.abs(index1-index2))){
                    if(index1<index2)
                        dir=1;
                    else dir=-1;
                    for(int j=0;j<dis;j++){
                        System.out.print(ll.getOneLineStation().get((index1+(dir)*j)).getName()+"->");
                        resultstring+=ll.getOneLineStation().get((index1+(dir)*j)).getName()+"->";
                    }
                    System.out.print(ll.getOneLineStation().get(index2).getName());
                    resultstring+=ll.getOneLineStation().get(index2).getName();
                }
                else {//要跨越重复站
                    if(index1<=index2)
                        dir=-1;
                    else
                        dir=1;

                    if(dir==1){
                        for(int j=index1;j<ll.getOneLineStation().size();j++){
                            System.out.print(ll.getOneLineStation().get(j).getName()+"->");
                            resultstring+=ll.getOneLineStation().get(j).getName()+"->";
                        }
                        for(int j=0;j<index2;j++){
                            System.out.print(ll.getOneLineStation().get((j)).getName()+"->");
                            resultstring+=ll.getOneLineStation().get((j)).getName()+"->";}
                        System.out.print(ll.getOneLineStation().get((index2)).getName());
                        resultstring+=ll.getOneLineStation().get((index2)).getName();
                    }
                    else{
                        for(int j=index1;j>=0;j--){
                            System.out.print(ll.getOneLineStation().get(j).getName()+"->");
                            resultstring+=ll.getOneLineStation().get(j).getName()+"->";
                        }
                        for(int j=ll.getOneLineStation().size()-1;j>index2;j--){
                            System.out.print(ll.getOneLineStation().get((j)).getName()+"->");
                            resultstring+=ll.getOneLineStation().get((j)).getName()+"->";
                        }
                        System.out.print(ll.getOneLineStation().get((index2)).getName());
                        resultstring+=ll.getOneLineStation().get((index2)).getName();
                    }


                }

            }
        }
    }


    static void writefile() throws IOException {
        FileWriter fileWriter=new FileWriter("/data/data/com.example.subway/files/Result.txt");
        fileWriter.write(resultstring+"\n");
        fileWriter.flush();
        fileWriter.close();
    }

    public static void getRoad(String s,String e){
        weightl=DataBuild.CanTransferStationList.size()+2;
        flagSizeOfW=0;
        one=-1;
        for(int i=0;i<weight.length;i++){
            for(int j=0;j<weight.length;j++)
                weight[i][j]=1000;

        }
        weight[0][0]=0;
        result.clear();
        change.clear();
        int i=0;
        Station start=new Station();
        Station end=new Station();
        int gets=0,gete=0;
        for(i=0;i<DataBuild.stationList.size();i++){
            if(gets==1&&gete==1){
                break;
            }
            if(DataBuild.stationList.get(i).getName().equals(s)){
                start=DataBuild.stationList.get(i);
                gets=1;
            }
            if(DataBuild.stationList.get(i).getName().equals(e)){
                end=DataBuild.stationList.get(i);
                gete=1;
            }
        }
        if(i>=DataBuild.stationList.size())
        {
            System.out.println("输入有误!");
            return;
        }


//        try{
//            System.out.print(start.getName());
//
//        }catch(NullPointerException exce){
//            System.out.print("输入错误!");
//        }
        //已取得首战 尾站。


//        for(i=0;i<DataBuild.CanTransferStationList.size();i++)
//            System.out.print(DataBuild.CanTransferStationList.get(i).getName()+" ");
//        System.out.println();

        //查明 首尾站是否尾可换乘站
        for(i=0;i<DataBuild.CanTransferStationList.size();i++){
            if(flagSizeOfW==3)
                break;
            if(start.getName().equals(DataBuild.CanTransferStationList.get(i).getName())&&flagSizeOfW!=1){
                Station t=DataBuild.CanTransferStationList.get(0);
                DataBuild.CanTransferStationList.set(0, DataBuild.CanTransferStationList.get(i));
                DataBuild.CanTransferStationList.set(i, t);
                weightl-=1;
                flagSizeOfW+=1;
            }
            if(end.getName().equals(DataBuild.CanTransferStationList.get(i).getName())&&flagSizeOfW!=2){
                Station t=DataBuild.CanTransferStationList.get(DataBuild.CanTransferStationList.size()-1);
                DataBuild.CanTransferStationList.set(DataBuild.CanTransferStationList.size()-1, DataBuild.CanTransferStationList.get(i));
                DataBuild.CanTransferStationList.set(i, t);
                weightl-=1;
                flagSizeOfW+=2;
            }
        }

//        System.out.println("wei:"+weightl);
//        System.out.println("can:"+DataBuild.CanTransferStationList.size());

        buildWeight(start,end);

        //查看weight矩阵
//        for(i=0;i<weightl;i++){
//            for(int j=0;j<weightl;j++)
//                System.out.print(String.format("%4d ", weight[i][j]));
//            System.out.println();
//        }
        //查看cantransfer站名
//        for(i=0;i<DataBuild.CanTransferStationList.size();i++)
//            System.out.print(DataBuild.CanTransferStationList.get(i).getName()+" ");
//        System.out.println(end.getName());


        result.add(start);
        int s1=0, e1=0;
        if(flagSizeOfW==0){//首尾站均不可换乘58
            s1=1;e1=1;
        }
        else if(flagSizeOfW==1){//仅首站换乘57
            e1=1;
        }
        else if(flagSizeOfW==2){//仅尾站可换乘57
            s1=1;
        }
        else if(flagSizeOfW==3){//均可换乘56
            e1=0;s1=0;
        }



        modiWeight();



        if(weight[0][weightl-1]==1000){
            System.out.println("无直达路线!");
            return;
        }
//        for(int j=0;j<weightl;j++)System.out.print(String.format("%4d ", weight[0][j]));
//            System.out.println();
////
        if(change.get(weightl-1)==-1){//不用换乘
            result.add(end);
        }
        else
            getTransfer(weightl-1,end);
//        for(i=0;i<result.size();i++)
//            System.out.print(i+":"+change.get(i)+" ");
//        System.out.println();

//        System.out.print("result:");
//        for(i=0;i<result.size();i++)
//            System.out.print(result.get(i).getName()+" ");
//        System.out.println();
        if(end.getName().equals(start.getName())){
            System.out.println("共乘坐"+0+"站");
            resultstring+="共乘坐0站";
        }
        else{
            System.out.println("共乘坐"+(weight[0][weightl-1]+1)+"站");
            resultstring+="共乘坐"+(weight[0][weightl-1]+1)+"站";
        }
        getEveryStation();
        System.out.println();
        resultstring+="\n-------\n";
        try {
            writefile();
        } catch (IOException e2) {
            e2.printStackTrace();
        }
    }

}
复制代码

 

posted @   奶油冰激凌  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示