package com.common.bus;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
public class SimpleBusArith {
public static final String BUS_NO1="bus1";
public static final String BUS_N02="bus2";
public static final String BUS_CROSS_SITE="crosssite";
private static boolean contain(String site, String[] sites) {
for (int i = 0; i < sites.length; i++) {
if (site.equals(sites[i]))
return true;
}
return false;
}
public static Set<String> getSiteChange(Set<String> buses, List<Bus> sites) {
Set<String> list = new HashSet();
List<Bus> busList = change2BusList(buses, sites);
for (int k = 0; k < busList.size(); k++) {
Bus b = busList.get(k);
String[] sx = b.getSx();
for (int i = 0; i < sx.length; i++) {
Set<String> bb = getSite(sx[i], sites);
if (bb != null) {
for (int j = 0; j < bb.size(); j++) {
list.addAll(bb);
}
}
}
}
return list;
}
public static Bus getBus(String siteno, List<Bus> sites) {
for (int i = 0; i < sites.size(); i++) {
if (siteno.equals(sites.get(i).getSiteno()))
return sites.get(i);
}
return null;
}
public static Set<String> getSite(String siteName, List<Bus> sites) {
Set<String> list = new HashSet();
for (int i = 0; i < sites.size(); i++) {
Bus bus = sites.get(i);
String[] sx = bus.getShangxing();
String[] xx = bus.getXiaxing();
if (contain(siteName, sx) || contain(siteName, xx)) {
list.add(bus.getSiteno());
}
}
return list;
}
public static List<Bus> getCross(List<Bus> passA, List<Bus> passB) {
int as = passA.size();
int bs = passB.size();
List<Bus> result = new ArrayList();
for (int i = 0; i < as; i++) {
Bus busa = passA.get(i);
for (int j = 0; j < bs; j++) {
Bus busb = passB.get(j);
if (busa.getSiteno().equalsIgnoreCase(busb.getSiteno())) {
result.add(busa);
}
}
}
return result;
}
/**
* buses:途经某公交线路与之有交集的所有公交
* bus:一次换乘的焦点公交
* 返回换乘的公交线路
*/
public static Set<HashMap> getCrossSite(Bus bus1,Bus bus2){
if(bus1.getSiteno().equals(bus2.getSiteno())) return null;
Set<HashMap> sites=new HashSet();
String[] bus1_sx=bus1.getShangxing();
String[] bus1_xx=bus1.getXiaxing();
String[] bus2_sx=bus2.getShangxing();
String[] bus2_xx=bus2.getXiaxing();
Set<HashMap> sx=getArrayEqualElem(bus1,bus2,bus1_sx,bus2_sx);
Set<HashMap> xx=getArrayEqualElem(bus1,bus2,bus1_xx,bus2_xx);
sites.addAll(sx);
sites.addAll(xx);
return sites;
}
private static Set<HashMap> getArrayEqualElem(Bus bus1,Bus bus2,String[] str1,String[] str2){
Set<HashMap> sites=new HashSet();
for(int i=(str1.length-1);i>=0;i--){
for(int j=0;j<str2.length;j++){
if(str1[i].equals(str2[j])){
HashMap hm=new HashMap();
hm.put(BUS_NO1, bus1);
hm.put(BUS_N02, bus2);
hm.put(BUS_CROSS_SITE, str1[i]);
sites.add(hm);
//选择最优的一条线路返回,第一辆车坐的站数最多
return sites;
}
}
}
return sites;
}
public static List<Bus> change2BusList(Set<String> bus, List<Bus> sites) {
Iterator itr = bus.iterator();
List<Bus> res = new ArrayList();
while (itr.hasNext()) {
String b = (String) itr.next();
if (b == null) {
continue;
}
Bus mybus = getBus(b, sites);
res.add(mybus);
}
return res;
}
public static void main(String[] args) {
// String[] b_1 = "南站、望湖市场、兴宁桥、濠河、江厦公园、外滩、宁大附属医院、白沙路、东鹰花园、大庆北路、大通桥、孔浦、半路凉亭、怡江新村、路林市场"
// .split("、");
// String[] b_2 = "颐乐园、华丰庄园、丁香路、老庙小学、腊梅路、滨江花苑、中宁花园(锦诚花园)、明晨紫月、科技园区管委会、老庙→、陆家村、交通·BOBO城、中兴北路、车管所、江南村、余隘、林家、柴家漕、城市元年、东胜路、庆安会馆、东门口(天一广场)、阳光广场、鼓楼、西门口、西河街、第二医院→、望京欧院→、新芝路←、高塘新村"
// .split("、");
// String[] b_3 = "松下站、松下村、王家弄、华光城、市公管处、华侨城、中兴樱花公园、甬港新村、舟孟北路、七塔寺、灵桥东、灵桥西(日新街)、药行街、解放南路、鼓楼、孝闻街、广仁街、华慈医院、传染病医院、育才家园、宁波电大、育才路、姚江公园、姚江"
// .split("、");
// String[] b_550 = ("保税东区、嵩山路站、开发区医院、国贸花园、北仑青少年宫、新恒路、绍成小学、慎业、宁波职业技术学院站、明港中学站、大碶车站、人民路站、徐洋、新安、湖塘、民乐、育王、宝幢、五乡镇政府、邱隘、浙东科技创业中心、"
// + "会展中心南大门、福明、汽车东站、市公管处、儿童公园、黄鹂新村、李惠利医院、兴宁桥东、望湖市场、宁波南站")
// .split("、");
// String[] b_901 = ("汽车东站、四号桥、三号桥、体育馆、家乐福、明园、朝晖新城、二号桥、甬港新村、朱雀新村、"
// + "宁波大厦→、公管处、福明路、报社印务中心、松下村老年公寓、浅水湾、海太工业园、邱隘大道、方庄、青年路、沈家村、农科所、万里学院东校区、回龙、金会锻件厂、伟隆机电(沙家垫)、"
// + "红林、东钱湖镇政府、莫枝农贸市场、钱湖新村、方边、岳王庙、湖塘村、国七寺(陶公园)、建设村、陶公村、湖心景区")
// .split("、");
// String[] b_906 = "南站、青少年宫、第一医院、天封塔、灵塔医院、琴桥东、贺丞新村、李惠利医院、飞虹新村、鄞州电视台、黄泥桥、小城花园、爱尔妮制衣公司(四明路)、格兰云天、前河路、华泰剑桥、万里学院、三星奥克斯、顾家、培罗成、下应镇、李关弟中学、江陆村、邵家弄、华艺服饰、黄隘村、钱湖工业区、红林、东钱湖镇政府、钱湖卫生院、莫枝农贸市场、钱湖新村、岳王庙、湖塘村、大公叉口、凤凰桥、冠英庄、隐学山庄、郭家峙"
// .split("、");
// String[] b_908 = "汽车东站、野马电池公司、王家湾、东海花园、中兴小区、家乐福、常青藤小城、车管所、江南社区、农药厂、塑料厂、曙光北路、宁波卷烟厂、曙光电影院、工人新村、汽车北站、大庆南路、槐树路、槐树新村、西草马路、新马路、北岸琴森、宁波大剧院、运河桥、姚江公园、宁波教育学院、宁波电大、育才家园"
// .split("、");
// String[] b_960 = "江家新村、邱隘大道、方庄、青年路、沈家村、农科所、万里学校、回龙、钱湖工业区、伟隆机电(沙家垫)、红林、东钱湖镇政府、钱湖医院、东钱湖镇、莫枝农贸市场、钱湖新村、方边、岳王庙、湖塘村、大公岔口、冠英庄、隐学山庄、郭家峙、韩岭、马山、上水村、石刻群、横街、福泉山景区、官驿河头、下水村、下水小学、绿野岙村、洋山村"
// .split("、");
// Bus bus_1 = new Bus("1", b_1);
// Bus bus_2 = new Bus("2", b_2);
// Bus bus_3 = new Bus("3", b_3);
// Bus bus_550 = new Bus("550", b_550);
// Bus bus_901 = new Bus("901", b_901);
// Bus bus_906 = new Bus("906", b_906);
// Bus bus_908 = new Bus("908", b_908);
// Bus bus_960 = new Bus("960", b_960);
// List<Bus> busList = new ArrayList();
// busList.add(bus_1);
// busList.add(bus_2);
// busList.add(bus_3);
// busList.add(bus_550);
// busList.add(bus_901);
// busList.add(bus_906);
// busList.add(bus_908);
// busList.add(bus_960);
// String start = "邱隘大道", end = "第一医院";
// Set<String> passA = SimpleBusArith.getSite(start, busList);
// Set<String> passB = SimpleBusArith.getSite(end, busList);
//
// // 0次转乘
// List<Bus> busa = SimpleBusArith.change2BusList(passA, busList);
// List<Bus> busb = SimpleBusArith.change2BusList(passB, busList);
// List<Bus> res = SimpleBusArith.getCross(busa, busb);
// for (int i = 0; i < res.size(); i++) {
// System.out.println("直达线路:" + res.get(i).getSiteno());
// }
//
// // 1次转乘
// Set<String> passA1 = SimpleBusArith.getSiteChange(passA, busList);
// List<Bus> ll=SimpleBusArith.change2BusList(passA1, busList);
// List<Bus> res1 = SimpleBusArith.getCross(ll, busb);
// for (int i = 0; i < res1.size(); i++) {
// for(int j=0;j<busa.size();j++){
// Set<HashMap> ss = SimpleBusArith.getCrossSite(busa.get(j), res1.get(i));
// if(ss!=null&&ss.size()>0){
// Iterator itr = ss.iterator();
// while (itr.hasNext()) {
// HashMap b = (HashMap) itr.next();
// Bus b1=(Bus)b.get(BUS_NO1);
// Bus b2=(Bus)b.get(BUS_N02);
// System.out.println("1次换乘方案:["+start+"]先"+b1.getSiteno