課件課后練習代碼經典案例_第1頁
課件課后練習代碼經典案例_第2頁
課件課后練習代碼經典案例_第3頁
課件課后練習代碼經典案例_第4頁
課件課后練習代碼經典案例_第5頁
已閱讀5頁,還剩105頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

JavaOOPLogData數據成員設計及LogData基于字節(jié)數組的構造方法設計及LogData其他構造方法設計及LogRec數據成員設計及LogRec重載構造方法設計及l(fā)ogRecmatch方法的實Controller數據成員設計及實ControllerparseLogData方法設計及實ControllermatchLogData方法設計及實Controller數據抓取TimerTask設計及實Controller排序及groupBy方法設計及實Controller與View層關聯(lián)及數據更新LogDataLogData對象是從日志byte[]數組中解析出來的一個日志數據.實例變量代表日志屬性,常量是日志解析規(guī)則常數.還要定義日志屬性方法.user戶登錄time錄時host客戶登錄的地*登錄狀態(tài),是typepublicstaticfinalshort=*登出狀態(tài),是typepublicstaticfinalshort=/**Unix標準登錄類型定義privatestaticfinalString[]TYPES={"RUN_LVL","OLD_TIME","INIT_PROCESS","USER_PROCESS","ACCOUNTING"*日志文件記錄長度,是UnixpublicstaticfinalintLOG_LENGTH=372;*業(yè)務帳號,用戶屬性偏移位置,采用ASCIIpublicstaticfinalintUSER_OFFSET=publicstaticfinalintUSER_LENGTH=*進程號偏移位置,連續(xù)4個byte,是一個intpublicstaticfinalintPID_OFFSET=*登錄類型偏移位置,連續(xù)兩個byte,是shortpublicstaticfinalintTYPE_OFFSET=*登錄類型偏移位置,連續(xù)4個byte,intpublicstaticfinalintTIME_OFFSET=*登錄用戶主機名偏移位置,是ASCII編碼字符串,每個bytepublicstaticfinalintHOST_OFFSET=publicstaticfinalintHOST_LENGTH=publicclassLogData{{publicclass*登錄狀態(tài),是typepublicstaticfinalUSER_PROCESS=*登出狀態(tài),是typepublicstaticfinalDEAD_PROCESS=/**Unix標準登錄類型定義privatestaticfinalString[]TYPES={"RUN_LVL","OLD_TIME","INIT_PROCESS","USER_PROCESS","ACCOUNTING"*日志文件記錄長度,是UnixpublicstaticfinalintLOG_LENGTH=372;*privateString*業(yè)務帳號,用戶屬性偏移位置,采用ASCIIpublicstaticfinalintUSER_OFFSET=publicstaticfinalintUSER_LENGTH=*登錄進程號碼intprivateint*進程號偏移位置,連續(xù)4個byte,是一個intpublicstaticfinalintPID_OFFSET=*登錄類型:LOGIN或LOGOUTshortprivateshort*登錄類型偏移位置,連續(xù)兩個byte,是shortpublicstaticfinalintTYPE_OFFSET=*登錄時間,以秒為單位,int類型,是1970privateint*登錄類型偏移位置,連續(xù)4個byte,intpublicstaticfinalintTIME_OFFSET=80;*登錄用戶主機名,經常是IPprivateString*登錄用戶主機名偏移位置,是ASCII編碼字符串,每個bytepublicstaticfinalintHOST_OFFSET=publicstaticfinalintHOST_LENGTH= 增加屬性方法publicStringgetUser()return}publicvoidsetUser(String{this.user=}publicintgetPid()return}publicvoidsetPid(intpid)this.pid=}publicshortgetType()return}publicvoidsetType(short{this.type=}publicintgetTime()return}publicvoidsetTime(inttime)this.time=}publicStringgetHost()return publicvoidsetHost(Stringhost)this.host=publicclass{*登錄狀態(tài),是typepublicstaticfinalshortUSER_PROCESS=7;*登出狀態(tài),是typepublicstaticfinalshortDEAD_PROCESS=8;/**Unix標準登錄類型定義privatestaticfinalString[]TYPES={"RUN_LVL","OLD_TIME","INIT_PROCESS","USER_PROCESS","ACCOUNTING"*日志文件記錄長度,是UnixpublicstaticfinalintLOG_LENGTH=372;*privateString*業(yè)務帳號,用戶屬性偏移位置,采用ASCIIpublicstaticfinalintUSER_OFFSET=publicstaticfinalintUSER_LENGTH=*登錄進程號碼intprivateint*進程號偏移位置,連續(xù)4個byte,是一個intpublicstaticfinalintPID_OFFSET=*登錄類型:LOGIN或LOGOUTshortprivateshort*登錄類型偏移位置,連續(xù)兩個byte,是shortpublicstaticfinalintTYPE_OFFSET=*登錄時間,以秒為單位,int類型,是1970privateint*登錄類型偏移位置,連續(xù)4個byte,intpublicstaticfinalintTIME_OFFSET=80;*登錄用戶主機名,經常是IPprivateString*登錄用戶主機名偏移位置,是ASCII編碼字符串,每個bytepublicstaticfinalintHOST_OFFSET=publicstaticfinalintHOST_LENGTH=publicStringgetUser()return}publicvoidsetUser(String{this.user=}publicintgetPid()return}publicvoidsetPid(intpid)this.pid=}publicshortgetType()return}publicvoidsetType(short{this.type=}publicintgetTime()return}publicvoidsetTime(inttime)this.time=}publicStringgetHost()return}publicvoidsetHost(String{this.host=}}}在DMS業(yè)務中需要解析byte[]類型日志數據,解析為日志對象LogData對象實例.構造器是用來創(chuàng)建對象,初始化對象的屬性的.可以利用構造器解析byte[]數量類型的日志,創(chuàng)建LogData類型實例:將byte[]數據類型的日志解析為日將指定位置開始的byte[]數據類型的日志解析為日志將byteUnixbyte[]中數據解析為日志屬性,解析策參考DMS軟件需求說明書中數據定義部分:*根據日志數據byte[]解析為LogData參數log是日志數據,log一定是372個byte*@paramlog日志數據,log一定是372個bytepublicLogData(byte[]log)this.user=Utils.toString(log,USER_OFFSET,this.pid=Utils.toInt(log,PID_OFFSET);this.time=Utils.toInt(log,TIME_OFFSET);this.type=Utils.toShort(log,this.host=Utils.toString(log,HOST_OFFSET,將指定位置開始的byte[]數據類型的日志解析為日志對象,這個方法是從續(xù)的數據序列*根據日志數據byte[]解析為LogData其中l(wèi)ogs是日志數據,offset也就是說將logsoffset位置開始連續(xù)372字節(jié)@paramlogs@paramoffsetpublicLogData(byte[]logs,int{this.user=logs,USER_OFFSET+offset,this.pid=Utils.toInt(logs,PID_OFFSET+offset);this.time=Utils.toInt(logs,TIME_OFFSET+offset);this.type=Utils.toShort(logs,TYPE_OFFSET+offset);this.host=Utils.toString(logs,HOST_OFFSET+offset,在LogData類中增加如上構造器,并且重寫toString()用于測試.完整LogDatapublicclassLogData登錄狀態(tài),是typepublicstaticfinalshortUSER_PROCESS=登出狀態(tài),是typepublicstaticfinalshortDEAD_PROCESS=/**Unix標準登錄類型定義privatestaticfinalString[]TYPES={"RUN_LVL","BOOT_TIME","OLD_TIME","NEW_TIME","INIT_PROCESS","LOGIN_PROCESS","USER_PROCESS","DEAD_PROCESS","ACCOUNTING"日志文件記錄長度,是Unix publicstaticfinalintLOG_LENGTH=372;*privateString*業(yè)務帳號,用戶屬性偏移位置,采用ASCII編碼publicstaticfinalintUSER_OFFSET=publicstaticfinalintUSER_LENGTH=*登錄進程號碼intprivateint*進程號偏移位置,連續(xù)4個byte,是一個intpublicstaticfinalintPID_OFFSET=*登錄類型:LOGIN或LOGOUTshortprivateshort*登錄類型偏移位置,連續(xù)兩個byte,是shortpublicstaticfinalintTYPE_OFFSET=*登錄時間,以秒為單位,int類型,是1970privateint*登錄類型偏移位置,連續(xù)4個byte,intpublicstaticfinalintTIME_OFFSET=80;*登錄用戶主機名,經常是IPprivateString*登錄用戶主機名偏移位置,是ASCII編碼字符串,每個bytepublicstaticfinalintHOST_OFFSET=publicstaticfinalintHOST_LENGTH=257;publicLogData()}******

其中l(wèi)ogs是日志數據,offset也就是說將logsoffset位置開始連續(xù)372字節(jié)@paramlogs@paramoffsetpublicLogData(byte[]logs,intoffset)this.user=logs,USER_OFFSET+offset,this.pid=Utils.toInt(logs,PID_OFFSET+this.time=Utils.toInt(logs,TIME_OFFSET+this.type=Utils.toShort(logs,TYPE_OFFSET+this.host=logs,HOST_OFFSET+offset,}**參數log是日志數據,log一定是372個byte*@paramlog日志數據,log一定是372個bytepublicLogData(byte[]log)this.user=Utils.toString(log,USER_OFFSET,this.pid=Utils.toInt(log,this.time=Utils.toInt(log,this.type=Utils.toShort(log,this.host=Utils.toString(log,HOST_OFFSET,}publicStringgetUser()return}publicvoidsetUser(String{this.user=}publicintgetPid()return}publicvoidsetPid(intpid)this.pid=}publicshortgetType()return}publicvoidsetType(short{this.type=}publicintgetTime()return}publicvoidsetTime(inttime)this.time=}publicStringgetHost()return}publicvoidsetHost(Stringhost)this.host=}publicDategetDate()returnnewDate(this.time*}publicStringgetDateString()return}**publicStringStringstr=this.user+","+pid+","+TYPES[this.type]++Utils.formatDate(getTime())+","+return}publicStringtoString() separator=Stringstr=this.user+separator+pid+separator++separator+time+separator+return}publicStringtoString(Stringseparator)if(separator==null)separator=}Stringstr=this.user+separator+pid+separator++separator+time+separator+return}}publicclass{publicvoid=6f6d000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000304500070000000000"077c720000000000000000000000"0000000000000000000000000000"003139322e3136382e31302e3132"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000" "000000byte[]bytes=Utils.toBytes(data,LogDatalog1=newLogDatalog2=newLogData(bytes,}}執(zhí)試案例:得到Tom,12357,7,Tom,12357,7,,23,23將將字符串類型數據解析為日志對*構造器構建log的副本對*@parampublicLogData(LogDatalog)this.user=this.pid====}publicLogData(Stringuser,intshorttype,inttime,String{this.user=this.pid=pid;this.type=type;this.time=this.host=*將String類型的log解析為登錄記錄,其中l(wèi)og格式為:"*@paramlogtoString(publicLogData(String{String[]data=log.split(",");this.user=this.pid=this.time=this.type=this.host=在LogData類中增加如上構造器,并且重寫toString()用于測試.完整LogDatapublicclassLogData登錄狀態(tài),是typepublicstaticfinalshortUSER_PROCESS=登出狀態(tài),是typepublicstaticfinalshortDEAD_PROCESS=/**Unix標準登錄類型定義privatestaticfinalString[]TYPES={"RUN_LVL","OLD_TIME","INIT_PROCESS","USER_PROCESS","ACCOUNTING"*日志文件記錄長度,是UnixpublicstaticfinalintLOG_LENGTH=372;*privateString*業(yè)務帳號,用戶屬性偏移位置,采用ASCII編碼publicstaticfinalintUSER_OFFSET=publicstaticfinalintUSER_LENGTH=*登錄進程號碼intprivateint*進程號偏移位置,連續(xù)4個byte,是一個intpublicstaticfinalintPID_OFFSET=*登錄類型:LOGIN或LOGOUTshortprivateshort*登錄類型偏移位置,連續(xù)兩個byte,是shortpublicstaticfinalintTYPE_OFFSET=*登錄時間,以秒為單位,int類型,是1970privateint*登錄類型偏移位置,連續(xù)4個byte,intpublicstaticfinalintTIME_OFFSET=80;*登錄用戶主機名,經常是IPprivateString*登錄用戶主機名偏移位置,是ASCII編碼字符串,每個bytepublicstaticfinalintHOST_OFFSET=publicstaticfinalintHOST_LENGTH=257;publicLogData()}*構造器構建log的副本對*@parampublicLogData(LogDatalog)this.user=this.pid=this.type=this.time=this.host= publicLogData(Stringuser,intshorttype,inttime,Stringhost)super();this.user=this.pid=this.type=this.time=this.host=}**其中l(wèi)ogs是日志數據,offset*也就是說將logs數據中offset位置開始連續(xù)372**@paramlogs*@paramoffsetpublicLogData(byte[]logs,intoffset)this.user=logs,USER_OFFSET+offset,this.pid=Utils.toInt(logs,PID_OFFSET+this.time=Utils.toInt(logs,TIME_OFFSET+this.type=Utils.toShort(logs,TYPE_OFFSET+this.host=logs,HOST_OFFSET+offset,}**參數log是日志數據,log一定是372個byte*@paramlog日志數據,log一定是372個bytepublicLogData(byte[]log)this.user=Utils.toString(log,USER_OFFSET,this.pid=Utils.toInt(log,this.time=Utils.toInt(log,this.type=Utils.toShort(log,this.host=Utils.toString(log,HOST_OFFSET,}*將String類型的log解析為登錄記錄,其中l(wèi)og 格式為:"*@paramlog文本日志,格式與toString(publicLogData(Stringlog)String[]data=this.user=this.pid====}publicStringgetUser()return}publicvoidsetUser(String{this.user=}publicintgetPid()return}publicvoidsetPid(intpid)this.pid=}publicshortgetType()return}publicvoidsetType(short{this.type=}publicintgetTime()return}publicvoidsetTime(inttime) this.time= publicStringgetHost()return publicvoidsetHost(Stringhost)this.host= publicDategetDate()returnnewDate(this.time* publicStringgetDateString()return **publicStringStringstr=this.user+","+pid+","+TYPES[this.type]+ +Utils.formatDate(getTime())+","+ return publicStringtoString() separator=Stringstr=this.user+separator+pid+separator+ +separator+time+separator+ return publicStringtoString(Stringseparator)if(separator==null)separator= Stringstr=this.user+separator+pid+separator+ +separator+time+separator+return}}}} Tom,21121,7,,1 Tom,21121,7,,1 Tom,12357,7,,23日志需要匹配為成對是登錄登出記錄對,這個記錄對是需要到計費服務器進行統(tǒng)計計費.需要創(chuàng)建登錄日志記錄對類型,封裝登錄記錄對數據.LogReclogin和logout創(chuàng)建類LogRec,添加login和logoutpublicclassLogRecprivateLogDataprivateLogDatapublicLogRec()在LogRec中添加屬性方publicStringgetUser()returnpublicStringgetHost()returnpublicint{publicint{returnpublicintgetLogoutTime()returnpublicStringgetLogoutTimeString()returnpublicLogData{returnpublicLogData{returnpublicintgetDurations()returngetLogoutTime()-publicStringtoString()returnlogin.toString()+"|"+*logname*logintime*logouttime*durations*logip登錄終端的ippublicclass{privateLogDataprivateLogDatalogout;publicLogRec()}publicStringgetUser()return publicStringgetHost()return publicintgetPid()return publicintgetLoginTime()return publicStringgetLoginTimeString()return publicintgetLogoutTime()return publicStringgetLogoutTimeString()return}publicLogDatagetLogin()return}publicLogDatagetLogout()return}publicintgetDurations()returngetLogoutTime()-}publicStringtoString()returnlogin.toString()+"|"+}}根據登錄登出記錄創(chuàng)建日志記將文本形式的日志記錄對數據解析為日志IP判斷一個為登錄,一個為登出.publicLogRec(LogDatalogin,LogDatalogout) wnewRuntimeException({thrownewRuntimeException((login.getPid()!=logout.getPid())thrownewRuntimeException(if{thrownewRuntimeException(this.login=login;this.logout=logout;算法實現(xiàn),重用LogData@parampublicLogRec(StringfileRow)String[]data=this.login=newLogData(data[0]);this.logout=newLogData(data[1]);lognamelogintime登入時刻logouttime登出時刻durations*logip登錄終端的ippublicclassLogRec{privateLogDataprivateLogDatalogout;publicLogRec()}**@parampublicLogRec(StringfileRow)String[]data=this.login=newthis.logout=new publicLogRec(LogDatalogin,LogDatalogout)thrownewRuntimeException(" if thrownewRuntimeException(" if(login.getPid()!=logout.getPid())thrownewRuntimeException(" if thrownewRuntimeException(" this.login=this.logout= pubpublicStringgetUser()return publicStringgetHost()return publicintgetPid()return publicintgetLoginTime()return publicStringgetLoginTimeString()return publicintgetLogoutTime()return publicStringgetLogoutTimeString()return publicLogDatagetLogin()return publicLogDatagetLogout()return publicintgetDurations()returngetLogoutTime()- publicStringtoString()returnlogin.toString()+"|"+publicclassUnitTestpublicvoidLogDatalogin=newLogData("Tom",21121,(short)7,LogDatalogout=newLogData("Tom",21121,(short)8, LogReclogRec1=newLogRec(login,Strings=,23|"LogReclogRec2=new執(zhí)行得到Tom,21121,7,Tom,12357,7,,1|Tom,21121,8,,23|Tom,12357,8,,192.168.,192.16logRecmatch在LogRec中添加一個有登錄記錄的構造器,和一個匹配登出記錄的方法match用登錄記錄創(chuàng)建一個LogRecmatch登出記錄,并且返回true表示匹配成功.LogRec對象的匹配狀態(tài)如圖34:登錄記錄創(chuàng)建一個LogRec用于與match()@paramloginpublicLogRec(LogData{this.login= **@paramlogout*@return如果匹配成功返回publicbooleanmatch(LogDatareturn} {return}if(login.getPid()!=logout.getPid())return} {return}this.logout=return *logname*logintime*logouttime*durations*logip登錄終端的ip** publicclassLogRec{privateLogDataprivateLogDatalogout;publicLogRec()}**@parampublicLogRec(StringfileRow)String[]data=fileRow.split("\\|");//this.login=newthis.logout=new *登錄記錄創(chuàng)建一個LogRec*用于與match*@paramloginpublicLogRec(LogDatalogin)this.login= publicLogRec(LogDatalogin,LogDatalogout)thrownewRuntimeException("}{thrownewRuntimeException("}(login.getPid()!=logout.getPid())thrownewRuntimeException("}(!login.getHost().equals(logout.getHost())) thrownewRuntimeException("}this.login=this.logout=}**@paramlogout*@return如果匹配成功返回 publicbooleanmatch(LogDatareturn}if{return}if(login.getPid()!=logout.getPid())return}if{return}this.logout=return}publicStringgetUser()return publicStringgetHost()return publicintgetPid()return publicintgetLoginTime()return publicStringgetLoginTimeString()return publicintgetLogoutTime()return publicStringgetLogoutTimeString()return publicLogDatagetLogin()return publicLogDatagetLogout()return publicintgetDurations()returngetLogoutTime()- publicStringtoString()returnlogin.toString()+"|"+login=newLogData("Tom",21121,(short)7,logout=newLogData("Tom",21121,LogReclogRec=newbooleanmatch=logRec.match(loginSystem.out.println(match);//false不能匹配才成功match=logRec.match(logout);/ }:控制器實例需要日志數據源,便于從日志數據源獲取日志數據,并且定時的進行解析和匹配登錄登出日志,記錄匹配結果.需要合適實例變量記錄這些狀態(tài).在控制器中實例變量logDataSource引用數據源對象在控制器中實例變量matched匹配成對的日志數據數組.*,需要privateLogDataSource/**定時器,用于定時獲取日志數據源數據.privateTimer/**全部匹配的成對的Log記錄privateLogRec[]matched=/**已經登錄沒有登出的log記錄,也就是不配對的記錄privateLogData[]loginLogs=并且提供適當的屬性方法publicvoidsetLogDataSource(LogDataSourcelogDataSource)this.logDataSource=*publicclassController*publicfinalstaticintDYNAMIC=*publicfinalstaticintDURN_ASC=*publicfinalstaticintDURN_DESC=*publicfinalstaticintGROUP_BY=*publicfinalstaticintSEARCH=4;*DMS界面窗口對象的,在運行期間要具體窗口對privateDMSFrame*顯示數據的狀態(tài):包括5*privateint*日志數據源對象的,需要到具體數據源對privateLogDataSource/**定時器,用于定時獲取日志數據源數據.privateTimer /**全部匹配的成對的Log記錄privateLogRec[]matched=/**已經登錄沒有登出的log記錄,也就是不配對的記錄privateLogData[]loginLogs=publicvoidsetLogDataSource(LogDataSource{this.logDataSource=}publicvoidsetDmsFrame(DMSFramedmsFrame)this.dmsFrame=}*publicvoiddynamic()//TimershowType=dmsFrame.updateView("動態(tài)列表",}*publicvoiddurnAsc()showType=dmsFrame.updateView("升序排序日志數據",}*publicvoiddurnDesc()showType=dmsFrame.updateView("降序排序日志數據",}*publicvoidgroupBy()showType=}*publicvoidsearch()Stringkey=if(key.trim().equals(""))}showType=dmsFrame.updateView("搜索功能:"+}}從數據源獲取byte[]類型的log數據,需要解析為LogData從日志數據byte[]日志數據,根據byte[]日志數據長度計算解析的logData對象數量,將每在Controller中添加parseLogData@param intlength=logs.length/LogData[]list=newfor(intoffset=0,i=0;offset<offset+=LogData.LOG_LENGTH)list[i++]=newLogData(logs, return =6f6d000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000304500070000000000"077c720000000000000000000000"0000000000000000000000000000"003139322e3136382e31302e3132"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000"0000000000000000000000000000" "+ "+ "+ "+ "+ Controllercontroller=newLogData[]logs=}}執(zhí)行得到[Tom,12357,7,,23,Tom,12357,7,osIP配為一個LogRec對象.參考DMSV2詳細設計文檔2.2數據描述.為了實現(xiàn)登錄登出日志匹配操作,找到登錄日志記錄,調用matchLogOut如果找到登出日志,則matchLogOut()方法返回LogRecmatchLogOut方法返回null匹配成功的數組,表示已經登錄沒有登出的日志.算法流程參考圖匹配登出記錄方法matchLogOut()的實現(xiàn)算法:在日志對象數組list中查找配置登錄日志login對象的對應的登出日志對象logoutLogRecnull實現(xiàn)流程參考圖37***@param *@param *@return登出日志privateLogRecmatchLogOut(LogData[]LogDatalogin)LogReclogRec=newfor(LogDatalog:list)if{return}} return*privatevoidmatchLogData(LogData[]newLogs)LogData[]list=newLogs.length+System.arraycopy(loginLogs,0,newLogs.length,this.loginLogs=newLogData[]for(LogDatalog:list)//if(log.getType()=={LogDatalogin=//LogReclogRec=matchLogOut(list,//if(logRec!=null)matched=Arrays.copyOf(matched,matched.length+1);matched[matched.length-1]=}elseloginLogs=Arrays.copyOf(loginLogs,loginLogs.length+1);loginLogs[loginLogs.length-1]=Controller數據抓取TimerTask實現(xiàn)從數據源定時抓取byte利用java.util.Timer創(chuàng)建Timer類的實例,利用timer的方法schedult(timerTask010001000timerTask的run(在timerTask的run并且調用showDataList(matched)顯示數據到界面上.* publicvoid{if(timer!=null)timer=newtimer.schedule(newTimerTask()publicvoid{System.out.println("Catchlogs");byte[]logs=logDataSource.getNextLogs();LogData[]newLogs=parseLogData(logs);if(showType==DYNAMIC)},0,Controller排序及groupByOS登錄名進行利用集合的工具類ArraysAPI提供的排序方法sort實現(xiàn)自定義排序.自定義排序sort方法有兩個參數,第一個是被排序數組的,第二個參數是排序過程中的比較規(guī)則.比較規(guī)則是實現(xiàn)Comparator接口的對象,這個對象中實現(xiàn)比較規(guī)則方法intcompare(LogReco1,LogReco2).方法參數是排序過程中的兩個被比較對象,方法返回值如果等于0表示兩個對象相等,如果返回值>0表示o1大于o2,如果返回值<0表示o1小于o2.為了代碼的簡潔,可以采用內部類實現(xiàn)Comparator接口為了避免排序規(guī)程對原數組內容產生影響,要對原數組進行,對副本數組進行排序.升序的*publicvoiddurnAsc()LogRec[]all=Arrays.copyOf(matched,Arrays.sort(all,newComparator<LogRec>()publicintcompare(LogReco1,LogRec{returno1.getDurations()-showType=*publicvoiddurnAsc()LogRec[]all=Arrays.copyOf(matched,Arrays.sort(all,newComparator<LogRec>()publicintcompare(LogReco1,LogReco2)returno1.getDurations()- showType= *publicvoiddurnDesc()LogRec[]all=Arrays.copyOf(matched,Arrays.sort(all,newComparator<LogRec>()publicintcompare(LogReco1,LogReco2)returno1.getDurations()-}showType=}在Controller中增加按照用戶名分組統(tǒng)計的方法,并且添加成員內部類*publicvoidgroupBy()LogRec[]all=Arrays.copyOf(matched,Arrays.sort(all,newComparator<LogRec>()publicintcompare(LogReco1,LogReco2)}GroupLoggroupLog=null;GroupLog[]groupLogs={};GroupLogfor(LogReclogRec:all)if(groupLog!=null&&groupLog.sameUser(logRec)){}else//創(chuàng)建新GroupLog對象,添加到統(tǒng)計數組中groupLog=newGroupLog(logRec);groupLogs=Arrays.copyOf(groupLogs,groupLogs.length+1);groupLogs[groupLogs.length-1]=groupLog;}}//顯示到//顯示到showType=}classGroupLogStringintpublicGroupLog(LogReclog)this.user=this.durn= publicbooleansameUser(LogReclogRec)return }publicbooleanadd(LogReclogRec)if(sameUser(logRec))this.durn+=return}elsereturn}}publicStringtoString()returnUtils.leftPad(user,12)+Utils.leftPad("",+Utils.leftPad("",22)+Utils.leftPad("",+Utils.leftPad(durn,10)+Utils.leftPad("",}}在Controller中增加重載的方法showDataList()用于顯示數據到上.這個方法中首先將需要顯示的數據進行格式化,格式化為時候顯示的文本內容,然后調用界面上updateView方法顯示格式化的數據,并且在顯示時候傳遞數據的類型.在Controller@parampublicvoidshowDataList(LogRec[]list)StringBuilderbuf=newfor(LogReclogRec:list) 12)); logRec.getLoginTimeString(),logRec.getLogoutTimeString(), 16));} }***@param publicvoidshowDataList(GroupLog[]list)StringBuilderbuf=newfor(GroupLoglog:list)}}publicclassDMSMainpublicstaticvoidmain(String[]args)DMSFramedmsFrame=newControllercontroller=newLogDataSourcelogDataSource=new}}*publicclassControllerpublicfinalstaticintDYNAMIC=publicfinalstaticintDURN_ASC=publicfinalstaticintDURN_DESC=publicfinalstaticintGROUP_BY=*publicfinalstaticintSEARCH=4;*DMS界面窗口對象的,在運行期間要具體窗口對privateDMSFrame*顯示數據的狀態(tài):包括5privateintshowType; *日志數據源對象 ,需 privateLogDataSource/**定時器,用于定時獲取日志數據源數據.privateTimer/**全部匹配的成對的Log記錄privateLogRec[]matched=/**已經登錄沒有登出的log記錄,也就是不配對的記錄privateLogData[]loginLogs=publicvoidsetLogDataSource(LogDataSourcelogDataSource)this.logDataSource= publicvoidsetDmsFrame(DMSFramedmsFrame)this.dmsFrame= * publicvoidstartCatchLogs()if(timer!=null)}timer=newtimer.schedule(newTimerTask()publicvoidrun()System.out.println("Catchlogsbyte[]logs=LogData[]newLogs=if(showType==}},0,1000);}***@param** publicLogData[]parseLogData(byte[]logs)intlength=logs.len

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論