⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 search.java

📁 郑州市公交线路管理查询系统
💻 JAVA
字号:
package com.ljz.gongJiaoSearch;
import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.lang.reflect.Array;
import java.util.*;

public class Search{
	private static final boolean DEBUG=true;
	private static ArrayList LuXian;
	
	//获取详细解析后路线
	public String getPath2(){
		luXianObj=new ArrayList();
		ArrayList zz=new ArrayList();
		for(int w=0;w<luxian.size();w++){
			ArrayList a=null;
			String s=(String)luxian.get(w);
			String[] s2=s.split("-");
			String s1="";//记录座位状况  和  过站点数
			for(int i=0;i<s2.length-1;i++){
				a=getLuXian(a,s2[i],s2[i+1]);
			}
			for(int i=0;i<a.size();i++)
				zz.add(a.get(i));
		}
		//Debug(zz);
		for(int i=0;i<zz.size();i++){
			xiangXiJieXiLuXian((String)zz.get(i));
		}
		zz=null;
		
//		按过站点数排序
		Object[] zhanDianXinXiShuZu=luXianObj.toArray();
		Arrays.sort(zhanDianXinXiShuZu);
		//Debug(zhanDianXinXiShuZu);
		
	//输出
		
		return outPut(zhanDianXinXiShuZu);
	}
	//详细解析路线
	private ArrayList luXianObj=new ArrayList();
	public void xiangXiJieXiLuXian(String s){
		String[] k=s.split("-->");
		String zwei="";
		int zs=0;
		for(int i=0;i<k.length-1;i++){
			String r=k[i+1];
			int a=r.indexOf('*');
			String lxhao=r.substring(a+1,r.length());
			Debug("lkhao:  "+lxhao);
			String zd=r.substring(0, a);
			Debug("zd:  "+zd);
			
			int b=k[i].indexOf('*');
			String qd=k[i];
			if(b!=-1)
				qd=k[i].substring(0, b);
			
			zwei+=getZuoWeiXinXi(lxhao,qd);
			//+getZuoWeiXinXi(lxhao,zd)
			zs+=getGuoDianShu(lxhao, qd, zd);
		}
		
		luXianObj.add(new LuXianXinXi(s,zwei,zs));
	}
	//获取路线
	public String getPath(String s){
		luxian=new ArrayList();
		kg=false;kg2=true;
		String[] s2=null;
		for(int m=0;m<g3.size();m++){
			s2=((String)g3.get(m)).split(" ");
			if(g3.get(m).equals(s)){
				break;
			}
		}
		//返回起点可以到达的点
		ArrayList k=getGuoDian(s2[1]);
		//查询线路
		search(k,s2[2],s2[1]);
		//解释线路
		k=interpret();
		String tr="";
		for(int i=0;i<k.size();i++)
			tr+=k.get(i)+"\n";
		if(tr.equals(""))
			tr="Sorry!Not Search!";
		return tr;
	}
	//返回所有可能的情况
	private ArrayList g3;
	public ArrayList getKeNeng(String s,String s2){
		ArrayList g=new ArrayList();
		for(int i=0;i<LuXian.size();i++){
			String t=(String)LuXian.get(i);
			if(t.indexOf(s)!=-1||t.indexOf(s2)!=-1){
				String[] r=t.split("%%%");
				for(int ii=1;ii<r.length-1;ii++)
					g.add(r[ii]);
			}
		}
		ArrayList g1=new ArrayList();
		ArrayList g2=new ArrayList();
		g3=new ArrayList();
		//Debug(g);
		for(int i=0;i<g.size();i++)
			if(((String)g.get(i)).indexOf(s)!=-1){
				boolean b=true;
				for(int pp=0;pp<g1.size();pp++){
					if(g1.get(pp).equals(g.get(i))){
						b=false;
						break;
					}
				}
				if(b)
					g1.add(g.get(i));
			}
		for(int i=0;i<g.size();i++)
			if(((String)g.get(i)).indexOf(s2)!=-1){
				boolean b=true;
				for(int pp=0;pp<g2.size();pp++){
					if(g2.get(pp).equals(g.get(i))){
						b=false;
						break;
					}
				}
				if(b)
					g2.add(g.get(i));
			}
		int p=0;
		for(int i=0;i<g1.size();i++){
			for(int j=0;j<g2.size();j++){
				g3.add(++p+" "+g1.get(i)+" "+g2.get(j));
			}
		}
		return g3;
	}
	//interpret
	public ArrayList interpret(){
		ArrayList g=new ArrayList();
		for(int w=0;w<luxian.size();w++){
			String s=(String)luxian.get(w);
			String[] s2=s.split("-");
			String k="";
			k+=s2[0]+"-->"+s2[1]+getLuXian(s2[0],s2[1]);
			for(int i=1;i<s2.length-1;i++){
				k+="-->"+s2[i+1]+getLuXian(s2[i],s2[i+1]);
			}
			g.add(k);
		}
		return g;
	}
	//search
	boolean kg=false,kg2=true;
	ArrayList luxian=new ArrayList();
	
	public void search(ArrayList k,String zd,String parent){
		if(isInclude(k,zd)){
			kg=true;
			luxian.add(parent+"-"+zd);
		}
		if(kg){
			return;
		}	
		if(k.size()<=0||zd==null||parent==null||parent.split("-").length>3){
			Debug("error!,not search!");
//			JOptionPane.showMessageDialog(null, "多不起,系统无法找到合适路线!");
			return;
		}
		if(kg2){
			kg2=false;
			for(int i=0;i<k.size()-1;i++)
				search(getGuoDian((String)k.get(i)),zd,parent+"-"+k.get(i));
			kg2=true;
			search(getGuoDian((String)k.get(k.size()-1)),zd,parent+"-"+k.get(k.size()-1));
		}
	}
	//读入路线
	static{
		LuXian=new ArrayList();
		File f=new File("zhengzhou.txt");
		if(!f.exists()||!f.canRead()){
			Debug("file read err!!");
		}else{
			try{
				BufferedReader read=new BufferedReader(new FileReader(f));
				String s="";
				while((s=read.readLine())!=null){
					LuXian.add(s);
				}
				read.close();
			}catch(Exception ee){
				ee.printStackTrace();
			}	
		}
	}
	//DEBUG
	public static void Debug(ArrayList k){
		if(DEBUG)
		for(int i=0;i<k.size();i++)
			Debug((String)k.get(i));
	}
	public static void Debug(Object[] k){
		if(DEBUG)
		for(int i=0;i<k.length;i++)
			Debug(k[i].toString());
	}
	public static void Debug(String s){
		if(DEBUG)
		System.out.println(s);
	}
	//输出
	public String outPut(Object[] k){
		StringBuilder s=new StringBuilder();
		for(int i=0;i<k.length;i++)
			s.append(i+1+".  "+k[i]);
		return s.toString();
	}
	//返回起点可以到达的点
	public ArrayList getGuoDian(String n){
		ArrayList dian=new ArrayList();
		for(int w=0;w<LuXian.size();w++){
			String s=(String)LuXian.get(w);
			if(s.indexOf(n)!=-1){
				//Debug(s);
				String[] d=s.split("%%%");
				for(int j=1;j<d.length-1;j++){
					boolean b=true;
					for(int z=0;z<dian.size();z++){
						if(dian.get(z).equals(d[j])||d[j].equals(n)){
							b=false;
							break;
						}
					}
					if(b)
						dian.add(d[j]);
				}	
			}
		}
		return dian;
	}
	//根据起点和终点返回路线
	public String getLuXian(String q,String z){
		ArrayList luxian=new ArrayList();
		for(int w=0;w<LuXian.size();w++){
			String s=(String)LuXian.get(w);
			if(s.indexOf(q)!=-1&&s.indexOf(z)!=-1){
				int k=s.indexOf("%%%");
				luxian.add(s.substring(0,k));
			}
		}
		String b="";
		for(int q1=0;q1<luxian.size();q1++){
			b+=luxian.get(q1)+",";
		}
		if(!b.equals(""))
			b=b.substring(0,b.length()-1);
		b="("+b+")";
		return b;
	}
	//返回详细路线
	public ArrayList getLuXian(ArrayList a,String q,String z){
		//获取含有标记的路线
		ArrayList luxian=new ArrayList();
		for(int w=0;w<LuXian.size();w++){
			String s=(String)LuXian.get(w);
			if(s.indexOf(q)!=-1&&s.indexOf(z)!=-1){
				int k=s.indexOf("%%%");
				luxian.add(s.substring(0,k));
			}
		}
		ArrayList ls=new ArrayList();
		if(a==null){
			for(int i=0;i<luxian.size();i++)
				ls.add(q+"-->"+z+"*"+luxian.get(i));
		}else{
			for (int i = 0; i < a.size(); i++) {
				for (int j = 0; j < luxian.size(); j++) {
					ls.add(""+a.get(i)+"-->"+z+"*"+luxian.get(j));
				}
			}
		}
		return ls;
	}
	//检验点群里是否含有终点
	public boolean isInclude(ArrayList k,String zd){
		for(int i=0;i<k.size();i++)
			if(k.get(i).equals(zd))
				return true;
		return false;
	}
	//返回所有线路号集合
	public String[] getHaos(){
		String[] b=new String[LuXian.size()];
		for(int i=0;i<LuXian.size();i++){
			String[] z=((String)LuXian.get(i)).split("%%%");
			b[i]=z[0];
		}
		return b;
	}
	//返回某条线路的详细信息
	public String getXiangXi(String s){
		String[] z=null;
		for(int i=0;i<LuXian.size();i++){
			z=((String)LuXian.get(i)).split("%%%");
			if(s.equals(z[0])){
				break;
			}
		}
		String k="";
		k+="名称:"+z[0]+"\n路线:";
		for(int i=1;i<z.length-2;i++){
			k+=z[i]+"->";
		}
		k+=z[z.length-2]+"\n说明:"+z[z.length-1];
		return k;
	}
	//返回某条路线上的所有站点
	public  String[] fanHuiZhanDian(String s) {
		String[] z=null;
		for(int i=0;i<LuXian.size();i++){
			z=((String)LuXian.get(i)).split("%%%");
			if(s.equals(z[0])){
				break;
			}
		}
		String[] k=new String[z.length-2];
		for (int i = 1; i < z.length-1; i++) {
			k[i-1]= z[i];
		}
		return k;
	}
	//分析经过多少站点(经过站点列表,站点总数,大约千米数)
	public int getGuoDianShu(String luxian,String qd,String zd){
		String[] s=fanHuiZhanDian(luxian);
		int i = 0;//终点位置
		for (; i < s.length; i++) 
			if(zd.equals(s[i]))
				break;
		int ii = 0;//起点位置
		for (; ii < s.length;ii++) 
			if(qd.equals(s[ii]))
				break;
		return Math.abs(i-ii);
	}
	//分析站点座位情况
	public String getZuoWeiXinXi(String luxian,String qd){//qd为乘坐点,zd为到达点
		String[] s=fanHuiZhanDian(luxian);
		//int i = 0;//终点位置
		//for (; i < s.length; i++) 
		//	if(zd.equals(s[i]))
		//		break;
		int ii = 0;//起点位置
		for (; ii < s.length;ii++) 
			if(qd.equals(s[ii]))
				break;
		int j=s.length;
		//计算
		if(ii<4 || ii>j-3){//逆行
			return qd+":有座位   ";
		}
		return qd+":无座位   ";
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -