数据测试内容以及详情见
https://github.com/xueyeyu/avgsp
/* 作者:雪夜羽 平均车速计算(sqlserver)基于电警 QQ:1412900482 */ import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; //import java.sql.Statement; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; //import java.text.SimpleDateFormat; //import java.util.Date; public class avgsp { //变量声明 // // //定义SQL server数据库驱动 final String driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"; //定义SQL server链接 final String dburl="jdbc:sqlserver://localhost:1433;"; private final String sheet; private final String dbname; private final String dbuser; private final String dbpassword; //定义数据 private final int []fx = {1,2,3,4}; //定义存储结果 //0车牌,1时间,3方向 4车道号 可存储 1 0000 条数据 private String rs1[][]=new String [100*100][4]; private String rs2[][]=new String [100*100][4]; //定义不重复车牌 (distinct) private String []chepai1 = new String[100*100]; private String []chepai2 = new String[100*100]; //记录数组存放的条数 int rs1i=0; int rs2i=0; //记录不重复车辆的条数 int chepai1i=0; int chepai2i=0; String sql1,sql2; //构造器 传递参数 public avgsp (String dbname,String dbuser,String dbpassword,String sheet) { this.dbname=dbname; this.dbuser=dbuser; this.dbpassword=dbpassword; this.sheet=sheet; //考虑加入e字段(卡口编号) this.sql1= "SELECT a,f,i,h FROM " + sheet +" where e = ? and a <> 'f941c96603e51c3c3f6297dc385d4cdc' and a <> '39d6d1ed9e4cb2571d8a3dd937827396' and f between ? and ? order by a,f asc"; this.sql2= "SELECT distinct a FROM " + sheet +" where e = ? and f between ? and ? order by a asc"; } public void query (String time1,String time2,String kakou1,String kakou2) { // // //private String time1; //private String time2; //private String kakou1; //private String kakou2; //加载驱动 try { Class.forName(driver); System.out.println("加载数据库驱动成功"); } //抛出异常 catch(ClassNotFoundException e) { System.out.println("加载数据库驱动失败"); } //尝试链接数据库 //建立链接 try { Connection conn = DriverManager.getConnection(dburl+ "databasename="+dbname,dbuser,dbpassword); System.out.println("数据库连接成功"); //System.out.println("开始读取数据库"); // // //初始化循环变量 //int fxi=0; //执行查询操作 //定义查询语句 //String sql1 = "SELECT a,f,j,i FROM " + sheet +" where e = ? and f between ? and ? order by a asc"; //搜索不重复车牌 //String sql2 = "SELECT distinct a FROM " + sheet +" where e = ? and f between ? and ? order by a asc"; PreparedStatement pstmt1=conn.prepareStatement(sql1); pstmt1.setString(1, kakou1); pstmt1.setString(2, time1); pstmt1.setString(3, time2); //pstmt.setInt(4, fx[fxi]); //获取结果 ResultSet result1 = pstmt1.executeQuery(); //逐行(条)读取数据 while(result1.next()) { //赋值车牌 this.rs1[rs1i][0] = result1.getString(1); //赋值时间 this.rs1[rs1i][1] = result1.getString(2); //赋值方向 this.rs1[rs1i][2] = result1.getString(3); //赋值车道号 this.rs1[rs1i][3] = result1.getString(4); rs1i++; } result1.close(); //执行查询不重复车牌操作 PreparedStatement pstmt1x=conn.prepareStatement(sql2); pstmt1x.setString(1, kakou1); pstmt1x.setString(2, time1); pstmt1x.setString(3, time2); ResultSet rschepai = pstmt1x.executeQuery(); while(rschepai.next()) { //赋值不重复车牌 this.chepai1[chepai1i] = rschepai.getString(1); chepai1i++; } rschepai.close(); //System.out.println("卡口 "+kakou1+" 记录数量为 "+rs1i); //System.out.println("卡口 "+kakou1+" 不重复车辆数量为 "+chepai1i); // //************************************************** //**************************************************** //************************************************** // PreparedStatement pstmt2=conn.prepareStatement(sql1); pstmt2.setString(1, kakou2); pstmt2.setString(2, time1); pstmt2.setString(3, time2); //pstmt.setInt(4, fx[fxi]); ResultSet result2 = pstmt2.executeQuery(); while(result2.next()) { //赋值车牌 this.rs2[rs2i][0] = result2.getString(1); //赋值时间 this.rs2[rs2i][1] = result2.getString(2); //赋值方向 this.rs2[rs2i][2] = result2.getString(3); //赋值车道号 this.rs2[rs2i][3] = result2.getString(4); rs2i++; } result2.close(); //执行查询不重复车牌操作 PreparedStatement pstmt2x=conn.prepareStatement(sql2); pstmt2x.setString(1, kakou2); pstmt2x.setString(2, time1); pstmt2x.setString(3, time2); ResultSet rschepai2 = pstmt2x.executeQuery(); while(rschepai2.next()) { //赋值不重复车牌 this.chepai2[chepai2i] = rschepai2.getString(1); chepai2i++; } rschepai2.close(); //System.out.println("卡口 "+kakou2+" 记录数量为 "+rs2i); //System.out.println("卡口 "+kakou2+" 不重复车辆数量为 "+chepai2i); } //抛出异常 //catch(SQLException | ParseException e) catch(SQLException e) { e.printStackTrace(); } } //传递记录的数组数据 public String[][] returnrs1() { return rs1; } public String[][] returnrs2() { return rs2; } public String[] returnchepai1() { return chepai1; } public String[] returnchepai2() { return chepai2; } //传递记录的条数 public int returnrs1i() { return rs1i; } public int returnrs2i() { return rs2i; } public int returnchepai1i() { return chepai1i; } public int returnchepai2i() { return chepai2i; } } /* //初始化循环变量 //int fxi=0; //记录数组存放的条数 int rs1i=0; int rs2i=0; //记录不重复车辆的条数 int chepai1i=0; int chepai2i=0; //执行查询操作 PreparedStatement pstmt1=conn.prepareStatement(sql1); pstmt1.setString(1, kakou1); pstmt1.setString(2, time1); pstmt1.setString(3, time2); //pstmt.setInt(4, fx[fxi]); //获取结果 ResultSet result1 = pstmt1.executeQuery(); //逐行(条)读取数据 while(result1.next()) { //赋值车牌 this.rs1[rs1i][0] = result1.getString(1); //赋值时间 this.rs1[rs1i][1] = result1.getString(3); //赋值方向 this.rs1[rs1i][2] = result1.getString(4); //赋值车道号 this.rs1[rs1i][3] = result1.getString(5); rs1i++; } result1.close(); //执行查询不重复车牌操作 PreparedStatement pstmt1x=conn.prepareStatement(sql2); pstmt1x.setString(1, kakou1); pstmt1x.setString(2, time1); pstmt1x.setString(3, time2); ResultSet rschepai = pstmt1x.executeQuery(); while(rschepai.next()) { //赋值不重复车牌 this.chepai[chepai1i] = rschepai.getString(1); chepai1i++; } rschepai.close(); System.out.println("卡口 "+kakou2+" 数量为 "+rs1i); // //************************************************** //**************************************************** //************************************************** // int rs2i=0; //定义sql语句 distinct String sq2 = "SELECT a,b,c,d FROM " + sheet +" where b = ? and c between ? and ? "; PreparedStatement pstmt2=conn.prepareStatement(sql1); pstmt2.setString(1, kakou2); pstmt2.setString(2, time1); pstmt2.setString(3, time2); //pstmt.setInt(4, fx[fxi]); ResultSet result2 = pstmt2.executeQuery(); while(result2.next()) { //赋值车牌 this.rs2[i][0] = result2.getString(1); //赋值时间 this.rs2[i][1] = result2.getString(3); //赋值方向 this.rs2[i][2] = result2.getString(4); //赋值车道号 this.rs1[i][3] = result1.getString(5); rs2i++; } result2.close(); //执行查询不重复车牌操作 PreparedStatement pstmt2x=conn.prepareStatement(sql2); pstmt2x.setString(1, kakou2); pstmt2x.setString(2, time1); pstmt2x.setString(3, time2); ResultSet rschepai2 = pstmt2x.executeQuery(); while(rschepai2.next()) { //赋值不重复车牌 this.rschepai2[chepai2i] = rschepai2.getString(1); rschepai2i++; } rschepai2.close(); System.out.println("卡口 "+kakou2+" 数量为 "+rs2i); } } */ /* try { Class.forName(driver); //加载驱动 System.out.println("加载数据库驱动成功"); //创建新实例 //jisuan ins = new jisuan(time1,time2,kakou1,kakou2,sheet); } //抛出异常 catch(ClassNotFoundException e) { System.out.println("加载数据库驱动失败"); } //尝试链接数据库 //建立链接 try { Connection conn=DriverManager.getConnection(dburl+"databasename="+dbname,dbuser,dbpassword); System.out.println("数据库连接成功!"); //System.out.println("开始读取数据库"); jisuan A = new jisuan(sheet); A.query(time1,time2,kakou1,kakou2); } //抛出异常 //catch(SQLException | ParseException e) catch(SQLException e) { e.printStackTrace(); } } //变量声明 //定义SQL server数据库驱动 final String driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"; //定义SQL server服务 //final String conn="jdbc:sqlserver://localhost:1433;databasename=kakou"; final String dburl="jdbc:sqlserver://localhost:1433;"; //定义数据库名称 final String dbname="kakou"; //定义数据库用户名 ‘sa’ 为数据库管理员 final String dbuser="sa"; //定义数据库密码 final String dbpassword="password"; //定义表 final String sheet="d028"; //定义时间 final String time1="2016-03-01 03:00:00"; final String time2="2016-03-01 04:00:00"; //定义每次循环增加的时间 /****** time1 和 time2都增加,可自定义容错时间 例如 time1和time2的时间间隔为20分钟, 每次循环增加时间为15分钟, 03:00:00 03:20:00 03:15:00 03:35:00 03:30:00 03:50:00 03:45:00 04:05:00 合理设置容错时间可以避免忽略如下情况 03:18:00 进入卡口1 03:22:00 进入卡口2 //15为15分钟,以此类推 final int timex=15; //定义卡口编号 final String kakou1="3701033112"; final String kakou2="3701033109"; //定义卡口之间的距离 final int distance=1000; //尝试加载数据库驱动 try { Class.forName(driver); //加载驱动 System.out.println("加载数据库驱动成功"); //创建新实例 //jisuan ins = new jisuan(time1,time2,kakou1,kakou2,sheet); } //抛出异常 catch(ClassNotFoundException e) { System.out.println("加载数据库驱动失败"); } //尝试链接数据库 //建立链接 try { Connection conn=DriverManager.getConnection(dburl+"databasename="+dbname,dbuser,dbpassword); System.out.println("数据库连接成功!"); //System.out.println("开始读取数据库"); jisuan A = new jisuan(sheet); A.query(time1,time2,kakou1,kakou2); } //抛出异常 //catch(SQLException | ParseException e) catch(SQLException e) { e.printStackTrace(); } } } */
/* 作者:雪夜羽 平均车速计算(sqlserver)基于电警 QQ:1412900482 */ import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; //import java.sql.Statement; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; //import java.text.SimpleDateFormat; import java.util.Date; //打印数组值的类 import java.util.Arrays; // /* 找出两个卡口的数量结果集rs1和rs2 找出两个卡口的不重复车牌chepai1和chepai2 参照chepai1和chepai2寻找rs1和rs2的结果集 */ // //计算模块 public class jisuan { // //类变量不放在构造器里 // // // //定义和修改数据 /***********************************************/ //定义数据库名称 final String dbname="002"; //定义数据库用户名 ‘sa’ 为数据库管理员 final String dbuser="sa"; //定义数据库密码 final String dbpassword="SQLServer"; //定义表 final String sheet="[dbo].[01]"; //定义时间 //循环查询(每次加时间)都会重新定义 不用final变量 static String time1="2016-05-01 10:00:00 000"; static String time2="2016-05-01 18:00:00 000"; //定义每次循环增加的时间 /****** time1 和 time2都增加,可自定义容错时间 例如 time1和time2的时间间隔为20分钟, 每次循环增加时间为15分钟, 03:00:00 03:20:00 03:15:00 03:35:00 03:30:00 03:50:00 03:45:00 04:05:00 合理设置容错时间可以避免忽略如下情况 03:18:00 进入卡口1 03:22:00 进入卡口2 ******/ //15为15分钟,以此类推 final static int timex=15; //定义卡口编号 private final static String kakou1="3701022049"; private final static String kakou2="3701022116"; //定义卡口之间的距离 private final int distance=222; //定义下游进口驶入交叉口的方向 //1 南向北 2 东向西 3 北向南 4 西向东 private final static int downfx=1; //定义合理速度区间 private final double maxspeed=120/3.6; private final double minspeed=0.001/3.6; //定义每辆车最多能被卡口记录几次(每辆车能经过几次) private final int maxitem=10; //定义车道, //第一维是车道号码,第二维代表着 //private final int[][] /*********************************************/ //private String sheet; //定义日期格式 //SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS"); //Calendar calendar = Calendar.getInstance(); //未知?? //Date myDate1; //Date myDate2; //定义基本参数 //基础数据 //定义同时跑过卡口1和卡口2的车辆数(不重复) private static int liuliang; //定义卡口1、卡口2经过的不重复的车牌号 private static String[] chepai1 = new String [100*1000]; private static String[] chepai2 = new String [100*1000]; //定义sql直接导出的卡口1和卡口2的数据, //二维数组,第一列表示车牌,第二列表示时间,第三列表示行车方向,第四列表示车道号 private static String rs1[][]=new String [100*100][4]; private static String rs2[][]=new String [100*100][4]; //定义sql记录卡口1和卡口2的条数,卡口1和卡口2不重复车辆的条数 private static int rs1i,rs2i,chepai1i,chepai2i; //定义两个卡口都有的车牌 private static String chepai[] = new String [100*100]; //private static int time[] = new int [5000][5000]; //按车道划分平均行程时间和平均行程车速 //计算卡口的方向和车道流量 //根据卡口进口道方向分类车辆 //第二维 1 南向北 2 东向西 3 北向南 4 西向东 String [][] fxchepai = new String[100*100][4]; //每个卡口进口道方向和车道分类车牌和流量 //1 南向北 2 东向西 3 北向南 4 西向东 String [][] fx1chedaochepai = new String [100*100][9]; String [][] fx2chedaochepai = new String [100*100][9]; String [][] fx3chedaochepai = new String [100*100][9]; String [][] fx4chedaochepai = new String [100*100][9]; //根据卡口进口道分类各股车道的流量 //第一维表示方向,第二维表示车道 //向前推一个 0 南向北 1 东向西 2 北向南 3 西向东 int [][] chedaoliuliang = new int [4][9]; //temp3中为匹配车辆,例如 //90d48643ef3807461a2095f14be68e11 2016-03-02 07:10:22 970 4 2 //90d48643ef3807461a2095f14be68e11 2016-03-02 07:12:43 240 4 3 String [][] pipei1 = new String [5000][8]; //pipei1为第一个车道 String [][] pipei2 = new String [5000][8]; String [][] pipei3 = new String [5000][8]; String [][] pipei4 = new String [5000][8]; String [][] pipei5 = new String [5000][8]; String [][] pipei6 = new String [5000][8]; String [][] pipei7 = new String [5000][8]; String [][] pipei8 = new String [5000][8]; //定义匹配的行数,匹配车辆等于x除以二 //定义8个车道,每个车道匹配数量为200 int x1=0; int x2=0; int x3=0; int x4=0; int x5=0; int x6=0; int x7=0; int x8=0; public static void main (String args[]) { jisuan A = new jisuan(); Calendar calendar = Calendar.getInstance(); Date myDate1; int i=0; for(;i<=0;i++) { avgsp link=new avgsp(A.dbname,A.dbuser,A.dbpassword,A.sheet); //time1转换成日期格式 //执行查询 link.query(A.time1,A.time2,A.kakou1,A.kakou2); //获取结果 给本类的变量赋值 A.getchepai1(link.returnchepai1()); A.getchepai2(link.returnchepai2()); A.getrs1(link.returnrs1()); A.getrs2(link.returnrs2()); // A.getrs1i(link.returnrs1i()); A.getrs2i(link.returnrs2i()); A.getchepai1i(link.returnchepai1i()); A.getchepai2i(link.returnchepai2i()); //System.out.println("chepai1i "+chepai1i); //System.out.println("rs1i "+rs1i); System.out.println("time1 "+time1); System.out.println("time2 "+time2); //计算流量 A.liuliang(); // //A.find1(chepai[0]); //计算平均行程时间和平均行程速度 A.function(); A.chedaoliuliang(A.rs1,A.rs1i,1); A.chedaoliuliang(A.rs1,A.rs1i,2); A.chedaoliuliang(A.rs1,A.rs1i,3); A.chedaoliuliang(A.rs1,A.rs1i,4); A.chedaoliuliang(A.rs2,A.rs2i,1); A.chedaoliuliang(A.rs2,A.rs2i,2); A.chedaoliuliang(A.rs2,A.rs2i,3); A.chedaoliuliang(A.rs2,A.rs2i,4); //时间变化 myDate1=StrToDate(A.time1); calendar.setTime(myDate1); //加上timex时间 calendar.add(Calendar.MINUTE,timex); myDate1 = calendar.getTime(); A.time1=DateToStr(myDate1); myDate1=StrToDate(A.time2); calendar.setTime(myDate1); //加上timex时间 calendar.add(Calendar.MINUTE,timex); myDate1 = calendar.getTime(); A.time2=DateToStr(myDate1); A.chetime(); } //******************** //主函数结束 } //计算车头时距 public void chetime() { //System.out.println(Arrays.deepToString(rs1)); } //处理函数,可调用任何函数 public void function() { int i=0; //定义临时变量传递chepai数组里的值 String tempchepai; //循环卡口1 //System.out.println("卡口 "+this.kakou1+" 车牌 时间 方向 车道 "); //定义二维数组,作为每辆车的数据 //0 车牌 1 时间 2 方向 3 车道 String [][] temp1 = new String [maxitem][4]; String [][] temp2 = new String [maxitem][4]; //不同车存储时间 int [] sumtime = new int [9]; //接受qujiantime的返回值并按车道传递给temp3 int [][] temp3 = new int [maxitem][9]; //chedaoliuliang用于计算匹配的车辆流量,用于计算平均行程车速,不包含速度过大或速度过小的流量 int [] matchliuliang = new int [9]; //chedaoliuliang2用于全部有记录的车辆,包括速度过大或速度过小的留恋那个 int [] matchliuliang2=new int [9]; double [] avgtime=new double [9]; double [] avgspeed = new double [9]; //debug //temp1=this.find1("f941c96603e51c3c3f6297dc385d4cdc",this.rs1,this.rs1i); //temp2=this.find1("f941c96603e51c3c3f6297dc385d4cdc",this.rs2,this.rs2i); //System.out.println("车牌 时间 方向 车道 "); //temp1=Arrays.sort(temp1); //temp1=Arrays.sort(temp2); //debug //for(;i<=temp1.length;i++) //System.out.println(Arrays.toString(temp1[i])+Arrays.toString(temp2[i])); //select * from (select a,f,j,i from k0302 where e='3701033112' and f between '2016-03-02 03:00:00' and '2016-03-02 04:00:00' and a='f941c96603e51c3c3f6297dc385d4cdc') a join (select a,f,j,i from k0302 where e='3701033109' and f between '2016-03-02 03:00:00' and '2016-03-02 04:00:00' and a='f941c96603e51c3c3f6297dc385d4cdc') b on a.a=b.a //注意 find1已更改为有返回值 //System.out.println(" 车牌 时间 方向 车道 "); //kakou1和kakou2同时计算 //循环每辆车 for (;i<=this.liuliang-1;i++) { tempchepai=this.chepai[i]; //取出一辆车两个卡口的数据 temp1=this.find1(tempchepai,this.rs1,this.rs1i); temp2=this.find1(tempchepai,this.rs2,this.rs2i); //debug //System.out.println("temp1 "+Arrays.deepToString(temp1)); //System.out.println("temp2 "+Arrays.deepToString(temp2)); //调用接口 //调用处理函数接口 //int timei=0; //50-1为定义数组的长度 //for (;temp1[timei][1]!=null&&timei<=50-1;timei++) ///////////////////////////////////////////////// temp3=this.qujiantime(temp1,temp2,downfx); //System.out.println("temp3 "+Arrays.deepToString(temp3)); int j=0; int k=0; //长度为10 for (;j<=temp3.length-1;j++) { //长度为8 for (;k<=temp3[0].length-1;k++) { if (temp3[j][k]!=0) { matchliuliang2[k]++; if ((distance/maxspeed)*1000<temp3[j][k] && (distance/minspeed)*1000>temp3[j][k]) { //按列相加 sumtime[k]=temp3[j][k]+sumtime[k]; matchliuliang[k]++; } //debug //System.out.println("temp3 "+temp3[j][k]); //System.out.println("sumtime "+Arrays.toString(sumtime)); } } } } //System.out.println("sumtime "+Arrays.toString(sumtime)); //System.out.println("matchliuliang "+Arrays.toString(matchliuliang)); //System.out.println("matchliuliang2 "+Arrays.toString(matchliuliang2)); int l=0; for(;l<=sumtime.length-1;l++) { if (matchliuliang[l]!=0) { avgtime[l]=sumtime[l]/(matchliuliang[l]); avgtime[l]=avgtime[l]/1000; avgspeed[l]=3.6*distance/avgtime[l]; } } //System.out.println("avgtime "+Arrays.toString(avgtime)); System.out.println("avgspeed "+Arrays.toString(avgspeed)); //this.chedaoliuliang=chedaoliuliang; //this.avgtime=avgtime; //将两两匹配的数据代码放入数据库中 //System.out.println("this.pipei"+Arrays.deepToString(pipei2)); final String driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"; //定义SQL server链接 final String dburl="jdbc:sqlserver://localhost:1433;"; try { Class.forName(driver); System.out.println("加载数据库驱动成功"); } //抛出异常 catch(ClassNotFoundException e) { System.out.println("加载数据库驱动失败"); } try { Connection conn = DriverManager.getConnection(dburl+ "databasename=master","sa","SQLServer"); System.out.println("数据库连接成功"); PreparedStatement pstmt1=conn.prepareStatement("SELECT a,e,f,i,h into table1_all FROM [002].[dbo].[01] where e in (?,?) and f between ? and ?"); pstmt1.setString(1,jisuan.kakou1); pstmt1.setString(2,jisuan.kakou2); pstmt1.setString(3,jisuan.time1); pstmt1.setString(4,jisuan.time2); int result1 = pstmt1.executeUpdate(); if (result1==0) { System.out.println("执行失败1 "); } pstmt1=conn.prepareStatement("create table temp1(q int,time1 char(25),time2 char(25),upfx char(25),chepai char(50))"); result1 = pstmt1.executeUpdate(); if (result1==0) { System.out.println("执行失败2 "); } int ii=0; //更改pipei for (;pipei1[ii][0]!=null;ii++) { //更改pipei String ttime1=pipei1[ii][1]; String ttime2=pipei1[ii][5]; String tempfx=pipei1[ii][2]; String temp=pipei1[ii][0]; //更改h //统计在下游卡口time1和time2里多少辆车经过。h是车道 //temp是匹配成功的车的车牌号 pstmt1=conn.prepareStatement("insert into temp1 values ((select count(*) from table1_all where i=? and h=1 and e = ? and f between ? and ?),?,?,?,?)"); pstmt1.setInt(1, jisuan.downfx); pstmt1.setString(2, jisuan.kakou2); pstmt1.setString(3, ttime1); pstmt1.setString(4, ttime2); pstmt1.setString(5, ttime1); pstmt1.setString(6, ttime2); //上游进入方向 pstmt1.setString(7, tempfx); pstmt1.setString(8, temp); result1 = pstmt1.executeUpdate(); if (result1==0) { System.out.println("执行失败3 "); } } } catch(SQLException e) { e.printStackTrace(); } } //输入卡口的记录信息,记录条数和要求的进口道方向,按方向和车道返回值 //进口道方向 1 ↑ 2 ← 3 ↓ 4 → public void chedaoliuliang(String rsx[][],int rsxi,int fx) { int i=0; int j=0; //int j1,j2,j3,j4,j5,j6,j7,j8,j0; String tempchedao; int [] temp= new int [9]; //七个车道 //一维数组存车牌 String [][] chedaochepai = new String [100*100][9]; //遍历数组 for (;i<=rsxi-1;i++) { if (rsx[i][2].equals(Integer.toString(fx))) { //赋值车道号 tempchedao=rsx[i][3]; if (tempchedao.equals("1")) { //赋值车牌 chedaochepai[temp[1]][1]=rsx[i][0]; temp[1]++; } else if (tempchedao.equals("2")) { //赋值车牌 chedaochepai[temp[2]][2]=rsx[i][0]; temp[2]++; } else if (tempchedao.equals("3")) { //赋值车牌 chedaochepai[temp[3]][3]=rsx[i][0]; temp[3]++; } else if (tempchedao.equals("4")) { //赋值车牌 chedaochepai[temp[4]][4]=rsx[i][0]; temp[4]++; } else if (tempchedao.equals("5")) { //赋值车牌 chedaochepai[temp[5]][5]=rsx[i][0]; temp[5]++; } else if (tempchedao.equals("6")) { //赋值车牌 chedaochepai[temp[6]][6]=rsx[i][0]; temp[6]++; } else if (tempchedao.equals("7")) { //赋值车牌 chedaochepai[temp[7]][7]=rsx[i][0]; temp[7]++; } else if (tempchedao.equals("8")) { //赋值车牌 chedaochepai[temp[8]][8]=rsx[i][0]; temp[8]++; } else { //赋值车牌 chedaochepai[temp[0]][0]=rsx[i][0]; temp[0]++; } } else { continue; } } //类变量chedaoliuliang是0123 减一 //在 fx做下标数组时全部减一 for(;j<=this.chedaoliuliang[fx-1].length-1;j++) { this.chedaoliuliang[fx-1][j]=temp[j]; } //System.out.println("chedaochepai"+Arrays.deepToString(chedaochepai)); //System.out.println("chedaochepai "+Arrays.deepToString(chedaochepai)); System.out.println("chedaoliuliang "+fx+" "+Arrays.toString(this.chedaoliuliang[fx-1])); } //根据三股车流求区间车速 //根据下游交叉口分类 //fx为下游交叉口进口道的方向 //输入为每个车在卡口的参数,卡口2 temp2 为下游卡口,fx为上游掉头经过的下游卡口方向 public int [][] qujiantime(String[][] temp1 ,String[][] temp2,int fx) { // //定义后一个参数为下游交叉口 //设定此目的 在函数调用的时候 正反执行两遍而不是在放在此函数内,调用一次 //debug //static int [] sumtime = new int [8]={0,0,0,0,0,0,0,0}; //设置下标 i temp1 j temp2 int i=0,j=0; //设置左直右的时间数组 //定义7个车道 对应数组第二维的1-7 二维的第0个表示1-7之外的车道(大于7) //第一维记录每辆车通过kakou1和kakou2的时间 int chedaotime[][]=new int[maxitem][9]; //按车道分类 //按照下游车道分类 for (;j<=temp2.length-1&&temp2[j][0]!=null&&temp2[j][2].equals(Integer.toString(fx));j++) { //循环kakou1(temp1) for (;i<=temp1.length-1&&temp1[i][0]!=null /*&&!temp1[i][3].equals(fx)*/;i++) { //寻找到了匹配车辆 //System.out.println("shijian "+Arrays.toString(temp2[0])+" shijian"+Arrays.toString(temp1[i])); //关于匹配时间 //temp1[j][1] temp2[i][1]; //07:00:00 07:05:00 //07:03:00 //这时候7:03:00要和07:05:00匹配 //如果temp1第一个时间小于temp1的赋值 //如果temp1第二个时间小于temp1再次赋值, //如果temp1第三个时间大于temp1存在第二列 if (temp2[j][0].compareTo(temp1[i][0]) == 0 && /*(temp1[i+1][1]==null) || (*/(temp2[j][1].compareTo(temp1[i][1]) > 0)) { //一号车道 if (temp2[j][3].equals("1")) { //debug //System.out.println("gettemp"+Arrays.toString(getpipei(temp1[i],temp2[j]))); this.pipei1[this.x1]=getpipei(temp1[i],temp2[j]); this.x1++; //System.out.println("pipei"+Arrays.toString(pipei[j])); chedaotime[j][1]=diffstrtime(temp2[j][1],temp1[i][1]); //System.out.println("xxxxxxxxxxxxxxxxx "+chedaotime[j][3]); //System.out.println("xxxxxxxxxxxxxxxxxtemp1 "+Arrays.deepToString(temp1)); //System.out.println("xxxxxxxxxxxxxxxxxtemp2 "+Arrays.deepToString(temp2)); //记录给sumtime,sumtime是static变量,每次执行都保留原来的值 //sumtime[1]=chedaotime[j][1]+sumtime[1]; //System.out.println("执行了1"); //j++; } //二号车道 else if (temp2[j][3].equals("2")) { this.pipei2[this.x2]=getpipei(temp1[i],temp2[j]); this.x2++; chedaotime[j][2]=diffstrtime(temp2[j][1],temp1[i][1]); //sumtime[2]=chedaotime[j][2]+sumtime[2]; //System.out.println("执行了2"); //j++; } //三号车道 else if (temp2[j][3].equals("3")) { this.pipei3[this.x3]=getpipei(temp1[i],temp2[j]); this.x3++; chedaotime[j][3]=diffstrtime(temp2[j][1],temp1[i][1]); //sumtime[3]=chedaotime[j][3]+sumtime[3]; //j++; } //四号车道 else if (temp2[j][3].equals("4")) { this.pipei4[this.x4]=getpipei(temp1[i],temp2[j]); this.x4++; chedaotime[j][4]=diffstrtime(temp2[j][1],temp1[i][1]); //sumtime[4]=chedaotime[j][4]+sumtime[4]; //j++; } //五号车道 else if (temp2[j][3].equals("5")) { this.pipei5[this.x5]=getpipei(temp1[i],temp2[j]); this.x5++; chedaotime[j][5]=diffstrtime(temp2[j][1],temp1[i][1]); //sumtime[5]=chedaotime[j][5]+sumtime[5]; //j++; } //六号车道 else if (temp2[j][3].equals("6")) { this.pipei6[this.x6]=getpipei(temp1[i],temp2[j]); this.x6++; chedaotime[j][6]=diffstrtime(temp2[j][1],temp1[i][1]); //sumtime[6]=chedaotime[j][6]+sumtime[6]; //j++; } //七号车道 else if (temp2[j][3].equals("7")) { this.pipei7[this.x7]=getpipei(temp1[i],temp2[j]); this.x7++; chedaotime[j][7]=diffstrtime(temp2[j][1],temp1[i][1]); //sumtime[7]=chedaotime[j][7]+sumtime[7]; //j++; } //八号车道 else if (temp2[j][3].equals("8")) { this.pipei8[this.x8]=getpipei(temp1[i],temp2[j]); this.x8++; chedaotime[j][8]=diffstrtime(temp2[j][1],temp1[i][1]); //sumtime[7]=chedaotime[j][7]+sumtime[7]; //j++; } //其他,在8个之外 else { chedaotime[j][0]=diffstrtime(temp2[j][1],temp1[i][1]); //sumtime[0]=chedaotime[j][0]+sumtime[0]; //System.out.println("执行了else"); //j++; } } else if (temp2[j][0].compareTo(temp1[i][0]) == 0 &&temp2[j][1].compareTo(temp1[i][1]) < 0) { break; //先经过卡口2在经过卡口1,筛去 } //未找到(应该是有的如果执行这一步就有问题) else if (temp2[j][0].compareTo(temp1[i][0]) > 0) { System.out.println("车牌不匹配! "); break; } //未寻找到(车牌号是按升序排序的) else if (temp2[j][0].compareTo(temp1[i][0]) < 0) { System.out.println("未找到(应该是有的如果执行这一步就有问题)"); break; } else { //System.out.println("未找到(应该是有的如果执行这一步就有问题)"); } } } //每辆车根据下游车道记录,记录完毕 //System.out.println(Arrays.deepToString(chedaotime)); //运行结果如下 //[[0, 0, 70860, 0, 0, 0, 0, 0], //[0, 0, 0, 0, 0, 0, 0, 0], //[0, 0, 0, 0, 0, 0, 0, 0], //。。。。。。。。 //[0, 0, 0, 0, 0, 0, 0, 0]] return chedaotime; } //在chepai1和chepai2里寻找相同的车并给类变量数组chepai赋值,liuliang是chepai有效数据的长度 //计算流量 //考虑到流量是个基本参数,放在类变量里不用函数返回 public void liuliang() { int liuliang=0; //定义不重复车牌1和车牌2的数组下标 //i chepai1 j chepai2 k chepai int i=0,j=0,k=0; String temp; //debug //System.out.println(chepai1i+" "+chepai2i); //遍历经过卡口1不重复的车牌 //记录的条数在数组里减一 for(;(i<=chepai1i-1)&&(j<=chepai2i-1);i++) { //赋值临时变量 temp=chepai1[i]; //比较chepai1和chepai2的字符串大小(顺序) //目的是替换对chepai的遍历查找 //sql中对查找已经asc正序排序 if (temp.compareTo(chepai2[j]) == 0) { //debug //System.out.println(temp); this.chepai[k]=temp; //debug //System.out.println("匹配的车辆"+chepai[k]); k++; liuliang++; j++; } else if (temp.compareTo(chepai2[j]) > 0) { //debug //System.out.println(temp+" "+chepai2[j]+" "+i+" "+j); j++; i--; } } //System.out.println(liuliang); this.liuliang=liuliang; } //输入要查找到车牌,要查找的数组,数组有效长度输出查找结果的数组 //根据chepai数组查找rs1和rs2的位置 //返回值为chepai在rs1和rs2中的数组下标 //返回值为数组 //数组第一个值是元素个数 //第一个值下标为1 public String[][] find1(String chepai,String[][] rsx,int rsxi) { //定义查询返回数组 数组大小和find1(存储下标)对应 String [][] singleche = new String [maxitem][4]; //设置循环变量 //i为rs1的循环变量 //j为find1的循环变量 int i=0,j=0; //每一个车在卡口的记录最多有51-1条 (第一个值记录个数) //int [] find1 = new int[51]; //debug //System.out.println("rs1i "+rs1i); //按升序排序的数组 //chepai肯定在rs1中间,所以比较的结果是正的 //for 循环寻找rs1的下标存在find1里 //j<=maxitem-1保证存放每辆车的数组不越界 for(;i<=rsxi-1&&j<=maxitem-1;i++) { if (chepai.compareTo(rsx[i][0]) == 0) { //find1[j]=i; //debug //System.out.println("寻找的下标 "+i+" "+Arrays.toString(rsx[i])); //将记录写入singleche singleche[j][0]=rsx[i][0]; singleche[j][1]=rsx[i][1]; singleche[j][2]=rsx[i][2]; singleche[j][3]=rsx[i][3]; // j++; } else if (chepai.compareTo(rsx[i][0]) > 0) { //debug //System.out.println("执行>0"+i+" "+Arrays.toString(this.rs1[i])); continue; } else if (chepai.compareTo(rsx[i][0]) < 0) { //debug //System.out.println("执行<0"+i+" "+Arrays.toString(this.rs1[i])); break; } } //find1[0]=j-1; //debug //System.out.println(i+" "+j); //debug 对应输入卡口号输出每个车的卡口信息 System.out.println("singleche "+Arrays.deepToString(singleche)); return singleche; //考虑函数的思想,不直接调用类变量,采用参数传递 /* //同理 //寻找rs2 //重置循环变量赋值 i=0; j=1; int [] find2 = new int[50]; for(;i<=rs2i-1;i++) { if (chepai.compareTo(this.rs2[i][0]) == 0) { find2[j]=i; //debug System.out.println("寻找的下标 "+i+" "+Arrays.toString(this.rs2[i])); j++; } else if (chepai.compareTo(this.rs2[i][0]) > 0) { //debug //System.out.println("执行>0"+i+" "+Arrays.toString(this.rs1[i])); continue; } else if (chepai.compareTo(this.rs2[i][0]) < 0) { //debug //System.out.println("执行<0"+i+" "+Arrays.toString(this.rs1[i])); break; } } find2[0]=j-1; */ //考虑取出寻找数组 } //计算时间差 //返回数值单位为秒 //前减后 public int diffstrtime(String time1,String time2) { //定义时间差 int time; //调用函数将字符串类型转换成日期类型 Date date1=StrToDate(time1); Date date2=StrToDate(time2); //getTime获取1970-01-01 00:00:00到本时间的时间毫秒数 //强制转换 //!!! //int 4 字节 有符号类型的最大值为 2147483647 位 //所以最大的时间差为 2147483647/(3600*1000)=396小时 time=(int)(date1.getTime()-date2.getTime()); //转化为秒 //time=time/1000; return time; } //计算速度 public double qujianspeed(double time,double distance) { //定义速度 double speed; speed=distance/time; return speed; } //************************ //工具函数 //字符串转日期函数 不用static public static Date StrToDate(String str) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS"); Date date = null; try { date = format.parse(str); } catch (ParseException e) { e.printStackTrace(); } return date; } //将日期转成字符串 public static String DateToStr(Date date) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS"); String time=format.format(date); return time; } //******************************* //从sql中获取信息; //从其他类获取sql 函数 public void getchepai1(String[] chepai1) { this.chepai1=chepai1; //debug //System.out.println(chepai1[100]); } public void getchepai2(String[] chepai2) { this.chepai2=chepai2; //debug //System.out.println(chepai2[100]); } public void getrs1(String[][] rs1) { this.rs1=rs1; //debug //System.out.println(rs1[100][2]); } public void getrs2(String[][] rs2) { this.rs2=rs2; //debug //System.out.println(rs2[100][2]); } //获取数量函数 public void getchepai1i(int chepai1i) { this.chepai1i=chepai1i; } public void getchepai2i(int chepai2i) { this.chepai2i=chepai2i; } public void getrs1i(int rs1i) { this.rs1i=rs1i; } public void getrs2i(int rs2i) { this.rs2i=rs2i; } //将temp1和temp2合成一起 public String[] getpipei(String[] temp1,String[] temp2) { //int i=4; String [] temp3 = new String [8]; for (int i=0;i<4;i++) { temp3[i]=temp1[i]; } for (int i=0;i<4;i++) { temp3[i+4]=temp2[i]; } return temp3; } //类结束 //************************ } /* //sql查询函数和数组存储函数 //查询卡口 public void query(String time1 , String time2 , String kakou1 , String kakou2 ) { //初始化循环变量 //int fxi=0; //记录数组存放的条数 int rs1i=0; int rs2i=0; //记录不重复车辆的条数 int chepai1i=0; int chepai2i=0; //执行查询操作 PreparedStatement pstmt1=conn.prepareStatement(sql1); pstmt1.setString(1, kakou1); pstmt1.setString(2, time1); pstmt1.setString(3, time2); //pstmt.setInt(4, fx[fxi]); //获取结果 ResultSet result1 = pstmt1.executeQuery(); //逐行(条)读取数据 while(result1.next()) { //赋值车牌 this.rs1[rs1i][0] = result1.getString(1); //赋值时间 this.rs1[rs1i][1] = result1.getString(3); //赋值方向 this.rs1[rs1i][2] = result1.getString(4); //赋值车道号 this.rs1[rs1i][3] = result1.getString(5); rs1i++; } result1.close(); //执行查询不重复车牌操作 PreparedStatement pstmt1x=conn.prepareStatement(sql2); pstmt1x.setString(1, kakou1); pstmt1x.setString(2, time1); pstmt1x.setString(3, time2); ResultSet rschepai = pstmt1x.executeQuery(); while(rschepai.next()) { //赋值不重复车牌 this.chepai[chepai1i] = rschepai.getString(1); chepai1i++; } rschepai.close(); System.out.println("卡口 "+kakou2+" 数量为 "+rs1i); // //************************************************** //**************************************************** //************************************************** // int rs2i=0; //定义sql语句 distinct String sq2 = "SELECT a,b,c,d FROM " + sheet +" where b = ? and c between ? and ? "; PreparedStatement pstmt2=conn.prepareStatement(sql1); pstmt2.setString(1, kakou2); pstmt2.setString(2, time1); pstmt2.setString(3, time2); //pstmt.setInt(4, fx[fxi]); ResultSet result2 = pstmt2.executeQuery(); while(result2.next()) { //赋值车牌 this.rs2[i][0] = result2.getString(1); //赋值时间 this.rs2[i][1] = result2.getString(3); //赋值方向 this.rs2[i][2] = result2.getString(4); //赋值车道号 this.rs1[i][3] = result1.getString(5); rs2i++; } result2.close(); //执行查询不重复车牌操作 PreparedStatement pstmt2x=conn.prepareStatement(sql2); pstmt2x.setString(1, kakou2); pstmt2x.setString(2, time1); pstmt2x.setString(3, time2); ResultSet rschepai2 = pstmt2x.executeQuery(); while(rschepai2.next()) { //赋值不重复车牌 this.rschepai2[chepai2i] = rschepai2.getString(1); rschepai2i++; } rschepai2.close(); System.out.println("卡口 "+kakou2+" 数量为 "+rs2i); } */ /* //尝试将此函数加入到find1中 //计算一个车的时间差和速度 public void function() { int time,speed; String tempchepai; int[] tempfind1=new int[20]; int i=0; jisuan ins=new jisuan(); //先取出一个车牌 tempchepai=ins.chepai[1]; //debug 输出车牌编号和数据有几条 //System.out.println(tempchepai); tempfind1=ins.find1(tempchepai); //debug //System.out.println("find1 执行完毕"); //System.out.println(tempfind1[0]); int tempi=0; //取出rs1的相关数据 for (i=1;i<=tempfind1[0];i++) { //tempfind1里存的是chepai在rs1的数组下标 tempi=tempfind1[i]; //debug //System.out.println("tempchepai"+tempchepai); //System.out.println("rs1[tempi][0]"+rs1[tempi][0]); if (tempchepai.equals(this.rs1[tempi][0])) { System.out.println("车牌为 "+this.rs1[tempi][0]); System.out.println("时间为 "+this.rs1[tempi][1]); System.out.println("方向为 "+this.rs1[tempi][2]); System.out.println("车道为 "+this.rs1[tempi][3]); } else { System.out.println("数据异常"); } } } */