• 地铁换乘系统


    package Dao;
    
    
    import java.util.HashMap;
    import java.util.LinkedHashSet;
    import java.util.Map;
     
    /**
     * desc:地铁站对象
     * @author chaisson
     * @since 2015-5-31 上午10:22:44
     *
     */
    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;
     
     
    /**
     * desc:利用Dijkstra算法,计算地铁站经过路径,以南京地铁为例
     * @author chaisson
     * @since 2015-5-31 上午9:43:38
     *
     */
    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;
    	}
     
    	/**
    	 * desc: How to use the method
    	 * author chaisson
    	 * since 2015-5-31
    	 * version 1.0
    	 */
    	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);
    	//}
    		}
    }
    

      

  • 相关阅读:
    测试面试题集-接口测试(9)
    测试面试题集-性能测试(8)
    测试面试题集-网络基础(7)
    测试面试题集-Python编程题(6)
    测试面试题集-Python列表去重(5)
    测试面试题集-生活物品测试:杯子、伞、钢笔、桌子、行李箱、电梯、洗衣机(4)
    测试面试题集-测试用例设计(3)
    测试面试题集-测试基础理论(2)
    解决在docker环境中拉取svn项目中含有中文名称的文件时拉取失败的问题
    redisTemplate之opsForHash()用法分析
  • 原文地址:https://www.cnblogs.com/NCLONG/p/10652263.html
Copyright © 2020-2023  润新知