zoukankan      html  css  js  c++  java
  • 地铁换乘系统

    双人合作项目,合作伙伴:https://www.cnblogs.com/NCLONG/

    package Dao;
     
     
    import java.util.HashMap;
    import java.util.LinkedHashSet;
    import java.util.Map;
      
    public class Station {
         
        private String name; //地铁站名称,假设具备唯一性
         
        public Station prev; //本站在lineNo线上面的前一个站
         
        public Station next; //本站在lineNo线上面的后一个站
         
        //本站到某一个目标站(key)所经过的所有站集合(value),保持前后顺序
        private Map<Station,LinkedHashSet<Station>> orderSetMap = new HashMap<Station,LinkedHashSet<Station>>();
         
        public Station (String name){
            this.name = name;
        }
      
        public Station  () {
            // TODO Auto-generated constructor stub
        }
     
        public String getName() {
            return name;
        }
      
        public void setName(String name) {
            this.name = name;
        }
         
        public LinkedHashSet<Station> getAllPassedStations(Station station) {
            if(orderSetMap.get(station) == null){
                LinkedHashSet<Station> set = new LinkedHashSet<Station>();
                set.add(this);
                orderSetMap.put(station, set);
            }
            return orderSetMap.get(station);
        }
      
        public Map<Station, LinkedHashSet<Station>> getOrderSetMap() {
            return orderSetMap;
        }
         
        @Override
        public boolean equals(Object obj) {
            if(this == obj){
                return true;
            } else if(obj instanceof Station){
                Station s = (Station) obj;
                if(s.getName().equals(this.getName())){
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        }
         
        @Override
        public int hashCode() {
            return this.getName().hashCode();
        }
    }
    package Dao;
     
    import java.util.ArrayList;
    import java.util.LinkedHashSet;
    import java.util.List;
      
    public class Subway {
         
        private List<Station> outList = new ArrayList<Station>();//记录已经分析过的站点
         
        //计算从s1站到s2站的最短经过路径
        public void calculate(Station s1,Station s2){
            if(outList.size() == Subwayline.totalStaion){
                System.out.println("找到目标站点:"+s2.getName()+",共经过"+(s1.getAllPassedStations(s2).size()-1)+"站");
                for(Station station : s1.getAllPassedStations(s2)){
                    System.out.print(station.getName()+"->");
                }
                return;
            }
            if(!outList.contains(s1)){
                outList.add(s1);
            }
            //如果起点站的OrderSetMap为空,则第一次用起点站的前后站点初始化之
            if(s1.getOrderSetMap().isEmpty()){
                List<Station> Linkedstations = getAllLinkedStations(s1);
                for(Station s : Linkedstations){
                    s1.getAllPassedStations(s).add(s);
                }
            }
            Station parent = getShortestPath(s1);//获取距离起点站s1最近的一个站(有多个的话,随意取一个)
            if(parent == s2){
                System.out.println("找到目标站点:"+s2+",共经过"+(s1.getAllPassedStations(s2).size()-1)+"站");
                for(Station station : s1.getAllPassedStations(s2)){
                    System.out.print(station.getName()+"->");
                }
                return;
            }
            for(Station child : getAllLinkedStations(parent)){
                if(outList.contains(child)){
                    continue;
                }
                int shortestPath = (s1.getAllPassedStations(parent).size()-1) + 1;//前面这个1表示计算路径需要去除自身站点,后面这个1表示增加了1站距离
                if(s1.getAllPassedStations(child).contains(child)){
                    //如果s1已经计算过到此child的经过距离,那么比较出最小的距离
                    if((s1.getAllPassedStations(child).size()-1) > shortestPath){
                        //重置S1到周围各站的最小路径
                        s1.getAllPassedStations(child).clear();
                        s1.getAllPassedStations(child).addAll(s1.getAllPassedStations(parent));
                        s1.getAllPassedStations(child).add(child);
                    }
                } else {
                    //如果s1还没有计算过到此child的经过距离
                    s1.getAllPassedStations(child).addAll(s1.getAllPassedStations(parent));
                    s1.getAllPassedStations(child).add(child);
                }
            }
            outList.add(parent);
            calculate(s1,s2);//重复计算,往外面站点扩展
        }
         
        //取参数station到各个站的最短距离,相隔1站,距离为1,依次类推
        private Station getShortestPath(Station station){
            int minPatn = Integer.MAX_VALUE;
            Station rets = null;
            for(Station s :station.getOrderSetMap().keySet()){
                if(outList.contains(s)){
                    continue;
                }
                LinkedHashSet<Station> set  = station.getAllPassedStations(s);//参数station到s所经过的所有站点的集合
                if(set.size() < minPatn){
                    minPatn = set.size();
                    rets = s;
                }
            }
            return rets;
        }
         
        //获取参数station直接相连的所有站,包括交叉线上面的站
        private List<Station> getAllLinkedStations(Station station){
            List<Station> linkedStaions = new ArrayList<Station>();
            for(List<Station> line : Subwayline.lineSet){
                if(line.contains(station)){//如果某一条线包含了此站,注意由于重写了hashcode方法,只有name相同,即认为是同一个对象
                    Station s = line.get(line.indexOf(station));
                    if(s.prev != null){
                        linkedStaions.add(s.prev);
                    }
                    if(s.next != null){
                        linkedStaions.add(s.next);
                    }
                }
            }
            return linkedStaions;
        }
      
        public static void main(String[] args) {
            long t1 = System.currentTimeMillis();
            Subway sw = new Subway();
            sw.calculate(new Station("北海山"), new Station("北豆"));
            long t2 = System.currentTimeMillis();
            System.out.println();
            System.out.println("耗时:"+(t2-t1)+"ms");
        }
    }
    package Dao;
     
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import Util.JDBUtil;
    import java.sql.*;
    import java.util.ArrayList;
    import java.util.List;
     
    public class Subwayline {
        public static List<Station> line1 = new ArrayList<Station>();//1号线
        public static List<Station> line2 = new ArrayList<Station>();//2号线
        public static List<Station> line3 = new ArrayList<Station>();//3号线
        public static List<Station> line4 = new ArrayList<Station>();//10号线
        public static List<Station> line5 = new ArrayList<Station>();//s1号线
        public static List<Station> line6 = new ArrayList<Station>();//s8号线
        public static Set<List<Station>> lineSet = new HashSet<List<Station>>();//所有线集合
        public static int totalStaion = 0;//总的站点数量
        static Connection conn;
        static PreparedStatement ps = null;
        static ResultSet rs;
        static String sql = "select * from line1";
        //1号线
         
            public static List<Station> load1(){
                conn=JDBUtil.getConn();
                ps=null;
                ResultSet rs=null;
                String id;
                sql="select name from line1 ";
    //          sql="select * from station where Id between ? and ? order by Id";
                List<Station> users=new ArrayList<Station>();
                Station user=null;
                try {
                    ps=conn.prepareStatement(sql);
                    rs=ps.executeQuery();
                    while(rs.next()) {
                        user=new Station();
                        user.setName(rs.getString("name"));
                        users.add(user);
                    }
                }catch(SQLException e) {
                    e.printStackTrace();
                }finally {
                    try {
                         if(ps!=null)ps.close();
                         if(conn!=null)conn.close();
                     }catch(Exception e2) {
                         e2.printStackTrace();
                     }
                }
                return users;
            }
             
            public static List<Station> load2(){
                conn=JDBUtil.getConn();
                ps=null;
                ResultSet rs=null;
                String id;
                sql="select name from line2 ";
    //          sql="select * from station where Id between ? and ? order by Id";
                List<Station> users=new ArrayList<Station>();
                Station user=null;
                try {
                    ps=conn.prepareStatement(sql);
                    rs=ps.executeQuery();
                    while(rs.next()) {
                        user=new Station();
                        user.setName(rs.getString("name"));
                        users.add(user);
                    }
                }catch(SQLException e) {
                    e.printStackTrace();
                }finally {
                    try {
                         if(ps!=null)ps.close();
                         if(conn!=null)conn.close();
                     }catch(Exception e2) {
                         e2.printStackTrace();
                     }
                }
                return users;
            }
             
            public static List<Station> load3(){
                conn=JDBUtil.getConn();
                ps=null;
                ResultSet rs=null;
                String id;
                sql="select name from line3 ";
    //          sql="select * from station where Id between ? and ? order by Id";
                List<Station> users=new ArrayList<Station>();
                Station user=null;
                try {
                    ps=conn.prepareStatement(sql);
                    rs=ps.executeQuery();
                    while(rs.next()) {
                        user=new Station();
                        user.setName(rs.getString("name"));
                        users.add(user);
                    }
                }catch(SQLException e) {
                    e.printStackTrace();
                }finally {
                    try {
                         if(ps!=null)ps.close();
                         if(conn!=null)conn.close();
                     }catch(Exception e2) {
                         e2.printStackTrace();
                     }
                }
                return users;
            }
             
            public static List<Station> load4(){
                conn=JDBUtil.getConn();
                ps=null;
                ResultSet rs=null;
                String id;
                sql="select name from line4 ";
    //          sql="select * from station where Id between ? and ? order by Id";
                List<Station> users=new ArrayList<Station>();
                Station user=null;
                try {
                    ps=conn.prepareStatement(sql);
                    rs=ps.executeQuery();
                    while(rs.next()) {
                        user=new Station();
                        user.setName(rs.getString("name"));
                        users.add(user);
                    }
                }catch(SQLException e) {
                    e.printStackTrace();
                }finally {
                    try {
                         if(ps!=null)ps.close();
                         if(conn!=null)conn.close();
                     }catch(Exception e2) {
                         e2.printStackTrace();
                     }
                }
                return users;
            }
             
            public static List<Station> load5(){
                conn=JDBUtil.getConn();
                ps=null;
                ResultSet rs=null;
                String id;
                sql="select name from line5 ";
    //          sql="select * from station where Id between ? and ? order by Id";
                List<Station> users=new ArrayList<Station>();
                Station user=null;
                try {
                    ps=conn.prepareStatement(sql);
                    rs=ps.executeQuery();
                    while(rs.next()) {
                        user=new Station();
                        user.setName(rs.getString("name"));
                        users.add(user);
                    }
                }catch(SQLException e) {
                    e.printStackTrace();
                }finally {
                    try {
                         if(ps!=null)ps.close();
                         if(conn!=null)conn.close();
                     }catch(Exception e2) {
                         e2.printStackTrace();
                     }
                }
                return users;
            }
             
            public static List<Station> load6(){
                conn=JDBUtil.getConn();
                ps=null;
                ResultSet rs=null;
                String id;
                sql="select name from line6 ";
    //          sql="select * from station where Id between ? and ? order by Id";
                List<Station> users=new ArrayList<Station>();
                Station user=null;
                try {
                    ps=conn.prepareStatement(sql);
                    rs=ps.executeQuery();
                    while(rs.next()) {
                        user=new Station();
                        user.setName(rs.getString("name"));
                        users.add(user);
                    }
                }catch(SQLException e) {
                    e.printStackTrace();
                }finally {
                    try {
                         if(ps!=null)ps.close();
                         if(conn!=null)conn.close();
                     }catch(Exception e2) {
                         e2.printStackTrace();
                     }
                }
                return users;
            }
             
             
             
            static {
         
                line1=load1();
                line2=load2();
                line3=load3();
                line4=load4();
                line5=load5();
                line6=load6();
            lineSet.add(line1);
            lineSet.add(line2);
            lineSet.add(line3);
            lineSet.add(line4);
            lineSet.add(line5);
            lineSet.add(line6);
            totalStaion  = line1.size() + line2.size() + line3.size() + line4.size() + line5.size() + line6.size();
            System.out.println("总的站点数量:"+totalStaion);
        //}
            }
    }
  • 相关阅读:
    年度开源盛会 ApacheCon 来临,Apache Pulsar 专场大咖齐聚
    开源流数据公司 StreamNative 正式加入 CNCF,积极推动云原生策略发展
    php摇杆Tiger摇奖
    php调试局部错误强制输出 display_errors
    php文件写入PHP_EOL与FILE_APPEND
    window自动任务实现数据库定时备份
    php 跨服务器ftp移动文件
    linux 关于session缓存丢失,自己掉坑里面了
    mysql 定时任务
    mysql 查询去重 distinct
  • 原文地址:https://www.cnblogs.com/Excusezuo/p/10652311.html
Copyright © 2011-2022 走看看