?? search.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 + -