结对开发地铁查询
我的結對開發對象:王樹民。
首先寫后臺Java利用迪杰斯特拉算法
再寫前端頁面。
后臺代碼:
package com.test.dijkstra;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 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;}@Overridepublic 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;}}@Overridepublic int hashCode() {return this.getName().hashCode();} } package com.test.dijkstra;import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set;public class DataBuilder {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> line10 = new ArrayList<Station>();//4號線public static List<Station> lineS1 = new ArrayList<Station>();//5號線public static List<Station> lineS8 = new ArrayList<Station>();//6號線public static Set<List<Station>> lineSet = new HashSet<List<Station>>();//所有線集合public static int totalStaion = 0;//總的站點數量static { //1號線String line1Str = "上莊南、上莊、西王、時光街、長城橋、和平醫院、烈士陵園、新百廣場、解放廣場、平安大街、北國商城、博物院、體育場、北宋、談固、朝暉橋、白佛、留村、火炬廣場、石家莊東、南村、洨河大道、西莊、東莊、會展中心、行政中心、園博園、天元湖、東上澤、東洋";String[] line1Arr = line1Str.split("、");for(String s : line1Arr){line1.add(new Station(s));}for(int i =0;i<line1.size();i++){if(i<line1.size()-1){line1.get(i).next = line1.get(i+1);line1.get(i+1).prev = line1.get(i);}}/*******************************************************************************///2號線String line2Str = "西古城、鐵道大學、運河橋、藍天圣木、長安公園、北國商城、大戲院、新世隆、東崗頭、東三教、石家莊站、塔談、塔談南、南位、嘉華 ";String[] line2Arr = line2Str.split("、");for(String s : line2Arr){line2.add(new Station(s));}for(int i =0;i<line2.size();i++){if(i<line2.size()-1){line2.get(i).next = line2.get(i+1);line2.get(i+1).prev = line2.get(i);}}/*******************************************************************************///3號線String line3Str = "西三莊、水上公園、柏林莊、市莊、市二中、新百廣場、東里、槐安橋、西三教、石家莊站、東廣場、孫村、塔冢、東王、南王、位同、三教堂、中仰陵、天山大街、南豆、韓通、北樂鄉";String[] line3Arr = line3Str.split("、");for(String s : line3Arr){line3.add(new Station(s));}for(int i =0;i<line3.size();i++){if(i<line3.size()-1){line3.get(i).next = line3.get(i+1);line3.get(i+1).prev = line3.get(i);}}/*******************************************************************************/ //10號線String line10Str = "碧水藍灣、東良廂、華醫學院、法商學院、濱河街、京廣東街、塔談南、南栗、南焦客運站、趙卜口、南王、經濟學院、東明商城、兒童醫院、北宋、長安醫院、建華市場、北翟營、十里鋪、南高營、交通駕校";String[] line10Arr = line10Str.split("、");for(String s : line10Arr){line10.add(new Station(s));}for(int i =0;i<line10.size();i++){if(i<line10.size()-1){line10.get(i).next = line10.get(i+1);line10.get(i+1).prev = line10.get(i);}}/*******************************************************************************/ //s1號線String lineS1Str = "宮家莊、法商學院、東五里、碧海云天、審計廳、益友百貨、和平醫院、西焦、合作路、農科院、火車北站、市莊、軍械學院、藍天圣木、常青園、建華市場、南翟營\r\n" + "";String[] lineS1Arr = lineS1Str.split("、");for(String s : lineS1Arr){lineS1.add(new Station(s));}for(int i =0;i<lineS1.size();i++){if(i<lineS1.size()-1){lineS1.get(i).next = lineS1.get(i+1);lineS1.get(i+1).prev = lineS1.get(i);}}/*******************************************************************************/ //s8號線String lineS8Str = "東明商城、國際城、二十里鋪、留村、星辰廣場、北豆、南豆、東仰陵、北郗馬、東佐";String[] lineS8Arr = lineS8Str.split("、");for(String s : lineS8Arr){lineS8.add(new Station(s));}for(int i =0;i<lineS8.size();i++){if(i<lineS8.size()-1){lineS8.get(i).next = lineS8.get(i+1);lineS8.get(i+1).prev = lineS8.get(i);}}lineSet.add(line1);lineSet.add(line2);lineSet.add(line3);lineSet.add(line10);lineSet.add(lineS1);lineSet.add(lineS8);totalStaion = line1.size() + line2.size() + line3.size() + line10.size() + lineS1.size() + lineS8.size();System.out.println("總的站點數量:"+totalStaion);} } package com.test.dijkstra;import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Scanner;public class Subway {private List<Station> outList = new ArrayList<Station>();//記錄已經分析過的站點//計算從s1站到s2站的最短經過路徑public void calculate(Station s1,Station s2){if(outList.size() == DataBuilder.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 : DataBuilder.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();Scanner sc = new Scanner(System.in); System.out.println("請輸入起點站:"); String s1 = sc.nextLine();System.out.println("請輸入終點站:"); String s2 = sc.nextLine(); sw.calculate(new Station(s1), new Station(s2));long t2 = System.currentTimeMillis();System.out.println();System.out.println("耗時:"+(t2-t1)+"ms");} }寫完代碼在寫前端頁面時決定調用百度地圖但是不知道怎么將代碼與前端聯系起來實現像北京地鐵那樣的功能,后來在了解百度地圖后,發現百度有地鐵開發文檔便點進去看了看,發現其各種功能都比較全,但是之前寫的代碼感覺沒多么大的作用,而且百度地鐵文檔只有石家莊地鐵的兩條線路,不知如何是好,所以該項目暫時開發到這里。
?
轉載于:https://www.cnblogs.com/1061321925wu/p/10652249.html
總結
- 上一篇: 多个页面同时跳转到一个页面,然后返回到上
- 下一篇: 页面乱码及页面传值出现乱码