苏州北大青鸟|电脑人才培训中心『官方网站』

高中生毕业了做什么?高中生学什么好 苏州北大青鸟、苏州北大青鸟学费、苏州北大青鸟地址
ACCP7.0培训-入手最快 JAVA培训—收入最高 .NET培训—就业面最宽 网络营销培训—需求量最大
高中毕业学什么好 大学生找不到工作怎么办 学什么技术有前途(好转行) 初中(中专)毕业学什么好
当前位置: 主页 > 青鸟百科 >

JAVA/J2ME手机公交查询系统的设计

时间:2012-05-11 17:45来源: 作者: 点击:
1          手机公交查询系统功能详细实现
经过上面的描述,已经明确了手机公交查询系统需要实现的功能以及如何去完成这些功能。下面将具体的阐述如何实现这些功能。
1.1      服务器端的实现
本系统遵照J2EE 3、4层结构,使用了MVC、AO等设计模式。
1.1.1    基类(Base Class)的实现
采用AO模式,将数据库相关方法封装到一个基类中,由业务逻辑继承该基类。
数据库连接(Connection)通过配置WEB服务器上的连接池,同时将数据源绑定到JNDI,程序直接通过JNDI Name获取,实现了数据源的可配置性和高度可移植性。获取JNDI Name方法如下:
      Javax.sql.DataSource ds = (javax.sql.DataSource) ctx.lookup(dsName) ;
      //从数据源得到连接
      conn = ds.getConnection() ;
 因为后面需要多次调用关闭数据库连接,故关闭连接封装到一个方法中,具体实现如下:
      //关闭数据库连接
public void close(ResultSet rs,PreparedStatement ps,Connection con){
        try{
               if(rs!=null){
                      rs.close();
               }
               if(ps!=null){
                      ps.close();
               }
               if(con!=null){
                      con.close();
               }
        }catch(Exception e){
               e.printStackTrace();
        }
}
        
1.1.2    辅助类(Help Class)的实现
辅助类主要为业务类提供一些辅助功能,尽量实现功能的分离和高度封装。同时为了加快运行速度,减少JVM编译负担,采用PreparedStatement。部分方法如下:
(1)获得公交总数
一般查找总数用”select count(*) from businfo”,但这样因为是顺序遍历,一直要遍历到最后一条,效率不高,此处使用sqlRst.last();使游标直接指向最后一条记录,再用buscount = sqlRst.getRow();记录最后一条记录的行号,从而得到了总行数,比起前一个方法更快而且节约系统资源。
(2)插入数据库缓存,使得下一个用户查询该方案时可以直接从数据库中获取结果,从而大大的节约了用户时间和系统资源。实现方法如下:
   String sql="insert into zhuancheng(id,result1,result2,result3,result4) VALUES(?,?,?,?,?)";
   ps1 = conn.prepareStatement(sql) ;
   ps1.setString(1,start+end);
   ps1.setString(2,result1);
   ps1.setString(3,result2);
   ps1.setString(4,result3);
   ps1.setString(5,result4);
   ps1.executeUpdate();
用户查询时若数据库中已有缓存数据,则调用以下方法获取缓存的换乘数据:
  String sql1="select * from zhuancheng where id="+"'"+start+end+"'";
 ps1 = conn.prepareStatement(sql1) ;
 rs1 = ps1.executeQuery() ;
 while(rs1.next()){
    result1=rs1.getString("result1");
    result2=rs1.getString("result2");
    result3=rs1.getString("result3");
    result4=rs1.getString("result4");
 
1.1.3    业务逻辑类(Logic Class)的实现
(1)查询公交线路
该方法比较简单,通过“select * from businfo where busno="+busno”即可得到符合条件的公交车,同时返回用户需要的数据。
(2)按站查询经过的公交线路,步骤如下:
① 通过辅助类判断用户输入的站名或者附近标志名,并找到对应的公交站名。
② 通过Sql语句找到经过该站的公交车,存放在一个集合中并返回。
(3)按起点终点查找乘坐方案
这是本系统中最复杂的一块,通过前面提到的基于站点优先级和邻接矩阵的公交换乘算法和上下矩阵算法来实现,具体实现方法如下:
① 通过 start=tool.getbusstop(start); end=tool.getbusstop(end);来确定起点和终点的公交站名。
② 检验站名是否存在,存在则继续往下,不存在则返回提示信息。
③ 若站名存在,则尝试从数据库中取得直达缓存信息,如数据库中没有直达信息,则查找换乘信息。
④ 若数据库中没有缓存,则开始查找有无直达线路,找到后把结果存入数据库。
⑤ 如果没有直达方案,则开始查找1次换乘方案,找到后按照经过站数排序,站数少的排前面,由于换乘方案过多,故只返回前几条。
由于一次换乘结果可能成百上千,故只给用户前几条换乘方案进行选择,先将全部换乘方案按经过车站数进行排序,再取前4条返回给用户。
排序类为一个实现了Serializable和Comparable的工具类,具体排序方法在compareTo方法中实现,通过compareTo(Object b)来定义如何排序,代码如下:
 public int compareTo(Object b)
 {
    SortBean sort=(SortBean)b;
    return (this.length-sort.length) ;
 }
⑥换乘得到结果后放入Collection中返回。
⑦最后把找到的结果集写入到数据库缓存中。
tool.insertDB(start,end,zhuanchengresult[0],zhuanchengresult[1],zhuanchengresult[2],zhuanchengresult[3]);
⑧如果找不到一次换乘(这种情况非常渺茫),而用户又非常执着的要继续找公交车,就不得不使用二次换乘,算法在3.3节已有说明,下面列出具体做法:
首先查找出经过起点站和终点站的线路,再通过线路找到该站能直达的所有站点,以起点站为例:
              Collection stop1bus=findbusnobystop(stop1);//经过stop1的公交车
               Collection stop2bus=findbusnobystop(stop2);//经过stop2的公交车
        Iterator itr=stop1bus.iterator();
               while(itr.hasNext()){
                     Iterator initr1=searchbusline((String)itr.next()).iterator();
                     while(initr1.hasNext()){
                            String stopname=(String)initr1.next();
                                map1.put(stopname,"rubbish");
这里使用HashMap的KEY作为存放站名的容器,因为从一个站台辐射出去的公交线路经过的站点往往有重复,而HashMap在KEY重复的时候只是重新设置了VALUE值,KEY值则无法重复插入,故选用HashMap。
在分别找到起点和终点能直达的站点集合后,就开始进行循环查找,开始检验起点能直达的站点中是否有能直达终点能直达站点的站点,如有,则证明可以进行二次换乘。
               Iterator key1= map1.keySet().iterator();
               Iterator key2= map2.keySet().iterator();
               while(key1.hasNext()){
                      while(key2.hasNext()){
                             if(zhida.isEmpty()){
                                    String sop1=(String)key1.next();
                                    String sop2=(String)key2.next();
                                    zhida=zhida(sop1,sop2);
                             }
                             //内层break
                             if(!zhida.isEmpty()){ 
                                    System.out.println("找到中途换乘"+zhida.size());
                                    break;
                             }
                      }
                      //外层break
                      if(!zhida.isEmpty()){
                             System.out.println("break2"+zhida.size());
                             break;
                      }
               }
找到一条可行的线路后,再开始查找起点到转乘点1的线路和转乘点2到重点的线路,并放到一个String中:
//第1站到第2站的车号
                while(one2two.iterator().hasNext()){
                             System.out.println("step3");
                             nonstop2=(Nonstop)one2two.iterator().next();
                  busno1+=nonstop2.getBusno()+",";
                             }
                                       //第3站到第4站的车号
                      while(three2four.iterator().hasNext()){
                             System.out.println("step4");
                             nonstop3=(Nonstop)three2four.iterator().next();
                             busno2+=nonstop3.getBusno()+",";
                      }
最后把起点到第一换乘站,第一换乘站到第二换乘站,第二换乘站到终点站3段线路连接到一个String中并将改String添加到集合中,最后返回该集合:
                     result="从"+stop1+"站出发,乘坐"+busno1+"到"+huanchengstop1+"站转"+nonstop.getBusno()+"到"+
                 huanchengstop2+"站转"+busno2+"到"+stop2;
                      twohg.add(result);
                      System.out.println("find one");
               }catch(Exception e){
                      e.printStackTrace();
               }
              return twohg;
本算法采用了3个bean来保存3段路线的信息,每个bean中分别有start,end,busno3个属性,使得算法条理更加清晰化。

至此站站查询全部完成。


标签:

(原文标题:JAVA/J2ME手机公交查询系统的设计

(责任编辑:苏州北大青鸟



相关新闻

  • E-learning云计算机市场份额逐渐扩大
  • 基于WEB的成本管理系统的设计
  • 基于WEB的学生成绩管理系统的设计及
  • 基于WEB的汽车信息网站的设计
  • 基于WEB的信息信息发布系统的设计及
  • 基于WEB的JSP实验室管理系统的设计
  • 基于WEB的企业人事管理系统的设计
  • 基于JSP的商场进销存管理系统的设计
  • 基于JSP的网络交易市场物业管理系统
  • 基于WEB的毕业设计选题系统的设计及
    更多
    分享按钮
    ------分隔线----------------------------
    招生专题