日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

改進(jìn)JAVA字符串分解的方法

瀏覽:198日期:2024-06-07 16:28:16
內(nèi)容: 改進(jìn)JAVA字符串分解的方法一、概述 大多數(shù)Java程序員都曾經(jīng)使用過(guò)java.util.StringTokenizer類。它是一個(gè)很方便的字符串分解器,主要用來(lái)根據(jù)分隔符把字符串分割成標(biāo)記(Token),然后按照請(qǐng)求返回各個(gè)標(biāo)記。這個(gè)過(guò)程稱為Tokenization,實(shí)際上就是把字符序列轉(zhuǎn)換成應(yīng)用程序能夠理解的多個(gè)標(biāo)記。 雖然StringTokenizer用起來(lái)很方便,但它的功能卻很有限。這個(gè)類只是簡(jiǎn)單地在輸入字符串中查找分隔符,一旦找到了分隔符就分割字符串。它不會(huì)檢查分隔符是否在子串之中這類條件,當(dāng)輸入字符串中出現(xiàn)兩個(gè)連續(xù)的分隔符時(shí),它也不會(huì)返回''(字符串長(zhǎng)度為0)形式的標(biāo)記。 為了突破這些局限,Java 2平臺(tái)提供了BreakIterator類,它是在StringTokenizer之上改進(jìn)的字符串分解器。由于JDK 1.1.x沒(méi)有提供這個(gè)類,為了滿足自己的需要,開發(fā)者經(jīng)常花費(fèi)很多時(shí)間從頭開始編寫分解器。在涉及到數(shù)據(jù)格式化處理的大型工程中,這類定制的字符串分解器有時(shí)隨處可見,而且這種情況并不罕見。 本文的目標(biāo)是幫助你利用現(xiàn)有的StringTokenizer類,編寫一個(gè)高級(jí)字符串分解器。 二、StringTokenizer的局限 你可以用以下三種構(gòu)造函數(shù)中的任意一種創(chuàng)建StringTokenizer分解器: StringTokenizer(String sInput):以空白字符(“ ,“t,“n)為分隔符分割字符串。 StringTokenizer(String sInput, String sDelimiter):以sDelimiter為分隔符分割字符串。 StringTokenizer(String sInput, String sDelimiter, boolean bReturnTokens):以sDelimiter為分隔符分割字符串,但如果bReturnTokens為true,則分隔符也作為標(biāo)記返回。 第一個(gè)構(gòu)造函數(shù)不檢查輸入字符串是否包含子串。例如,如果以空白字符為分隔符分割“hello. Today 'I am ' going to my home town,則字符串分解結(jié)果是hello.、Today、'I、am、'、going等,而不是hello.、Today、'I am '、going等。 第二個(gè)構(gòu)造函數(shù)不檢查兩個(gè)分隔符連續(xù)出現(xiàn)的情況。例如,如果以“,為分隔符分割“book, author, publication,,,date published這個(gè)字符串,則StringTokenizer返回book、author、publication和date published這四個(gè)標(biāo)記,而不是book、author、publication、''、''和date published這6個(gè)標(biāo)記(其中''表示0長(zhǎng)度字符串)。要得到6個(gè)標(biāo)記的答案,你必須把StringTokenizer的bReturnTokens參數(shù)設(shè)置為true。 允許設(shè)置值為true的bReturnTokens參數(shù)是一個(gè)重要的功能,因?yàn)樗紤]到了分隔符連續(xù)出現(xiàn)的情況。例如,使用第二個(gè)構(gòu)造函數(shù)時(shí),如果數(shù)據(jù)是動(dòng)態(tài)收集得到而且要用來(lái)更新數(shù)據(jù)庫(kù)中的表,輸入字符串中的標(biāo)記對(duì)應(yīng)著表里面列的值,那么當(dāng)我們不能確定哪一個(gè)列應(yīng)該設(shè)置為''時(shí),我們就無(wú)法把輸入串中的標(biāo)記映射到數(shù)據(jù)庫(kù)列。假設(shè)我們要把記錄插入到一個(gè)有6個(gè)列的表,而輸入數(shù)據(jù)中包含兩個(gè)連續(xù)的分隔符。此時(shí),StringTokenizer的分解結(jié)果是5個(gè)標(biāo)記(兩個(gè)連續(xù)的分隔符代表''標(biāo)記,它將被StringTokenizer忽略),而我們卻有6個(gè)字段需要設(shè)置。同時(shí),我們也不知道連續(xù)分隔符在哪里出現(xiàn),所以也就不知道哪一個(gè)列應(yīng)該設(shè)置成''。 當(dāng)標(biāo)記本身等同于分隔符(無(wú)論是長(zhǎng)度還是值)且位于子串之內(nèi)時(shí),第三個(gè)構(gòu)造函數(shù)無(wú)效。例如,如果我們要以“,為分隔符分解字符串“book, author, publication,',',date published(這個(gè)字符串包含一個(gè)“,標(biāo)記,它與分隔符一樣),結(jié)果是book、author、publication、'、'、date published這六個(gè)標(biāo)記,而不是book、author、publication、,(逗號(hào)字符)、date published這五個(gè)標(biāo)記。再提醒一下,即使我們把StringTokenizer的bReturnTokens參數(shù)設(shè)置設(shè)置成了true,在這種情況下也沒(méi)有什么幫助。 三、高級(jí)字符串分解器 在編寫代碼之前,你必須搞清楚一個(gè)好的分解器有哪些基本要求。因?yàn)镴ava開發(fā)者已經(jīng)習(xí)慣于使用StringTokenizer類,所以一個(gè)好的分解器應(yīng)該提供StringTokenizer類提供的所有實(shí)用方法,比如hasMoreTokens()、nextToken()、countTokens()。 本文提供的代碼很簡(jiǎn)單,而且大部分代碼足以自我解釋。在這里,我主要利用了StringTokenizer類(創(chuàng)建類實(shí)例時(shí)bReturnTokens參數(shù)設(shè)置為true),并提供了上面提到的幾個(gè)方法。大多數(shù)時(shí)候標(biāo)記與分隔符不同,有些時(shí)候分隔符卻要作為標(biāo)記輸出(盡管非常罕見),此時(shí)如果出現(xiàn)了對(duì)標(biāo)記的請(qǐng)求,分解器要把分隔符作為標(biāo)記輸出。創(chuàng)建PowerfulTokenizer對(duì)象時(shí),你只需要提供輸入字符串和分隔符這兩個(gè)參數(shù),PowerfulTokenizer將在內(nèi)部使用bReturnTokens設(shè)置成true的StringTokenizer。(這么做的原因在于,如果不是用bReturnTokens設(shè)置成true的方式創(chuàng)建StringTokenizer,那么它將在解決先前提出的問(wèn)題時(shí)受到限制)。為了正確地控制分解器,代碼在幾個(gè)地方(計(jì)算標(biāo)記的總數(shù)量以及nextToken())檢查bReturnTokens是否設(shè)置成了true。 你可能已經(jīng)發(fā)現(xiàn),PowerfulTokenizer實(shí)現(xiàn)了Enumeration接口,從而也就實(shí)現(xiàn)了hasMoreElements()和nextElement()這兩個(gè)方法,而這兩個(gè)方法又分別把調(diào)用直接委托給hasMoreTokens()和nextToken()。(由于實(shí)現(xiàn)了Enumeration接口,PowerfulTokenizer實(shí)現(xiàn)了與StringTokenizer的向后兼容。) 我們來(lái)看一個(gè)例子,假設(shè)輸入字符串是“hello, Today,,, 'I, am ', going to,,, 'buy, a, book',分隔符是“,。用分解器分割這個(gè)字符串時(shí)返回結(jié)果如表1所示: 表1:字符串分解結(jié)果 輸入字符串包含11個(gè)逗號(hào)(,)字符,其中3個(gè)在子串里面、4個(gè)連續(xù)出現(xiàn)(“Today,,,中包含兩個(gè)連續(xù)逗號(hào),第一個(gè)逗號(hào)是Today的分隔符)。下面是PowerfulTokenizer計(jì)算標(biāo)記總數(shù)的算法: 如果bReturnTokens=true,把子串中的分隔符數(shù)量乘以2,再?gòu)膶?shí)際總數(shù)量減去該數(shù)字,就得到了標(biāo)記的總數(shù)。理由是,對(duì)于子串“buy, a, book,StringTokenizer將返回5個(gè)標(biāo)記(即“buy:,:a:,:book),而PowerfulTokenizer將返回一個(gè)標(biāo)記(即“buy, a, book),兩者的差值是4(即,2乘以子串中的分隔符數(shù)量)。這個(gè)公式對(duì)于所有包含分隔符的子串都有效。 類似地,對(duì)于bReturnTokens=false的情形,我們從實(shí)際總數(shù)(19)減去表達(dá)式[分隔符總數(shù)(11)- 連續(xù)分隔符數(shù)量(4) + 子串中的分隔符數(shù)量(3)]。由于這時(shí)我們不返回分隔符,它們(非連續(xù)出現(xiàn)或在子串內(nèi)部)對(duì)我們來(lái)說(shuō)沒(méi)有用,上面的公式為我們返回了標(biāo)記的總數(shù)量(9)。 請(qǐng)記住這兩個(gè)公式,它們是PowerfulTokenizer的核心。這兩個(gè)公式適用于幾乎所有它們各自條件下的情形。但是,如果你有更復(fù)雜的要求,不能使用這兩個(gè)公式,那么你應(yīng)該在編寫代碼之前分析各種可能出現(xiàn)的情況,并設(shè)計(jì)出自己的公式。 // 檢查分隔符是否位于子串之內(nèi) for (int i=1; i/td> { iIndex = sInput.indexOf(sDelim, iIndex+1); if (iIndex == -1) break; // 如果分隔符位于子串之內(nèi),則向前分析直至子串結(jié)束 while (sInput.substring(iIndex-iLen, iIndex).equals(sDelim)) { iNextIndex = sInput.indexOf(sDelim, iIndex+1); if (iNextIndex == -1) break; iIndex = iNextIndex; } aiIndex[i] = iIndex; //System.out.println('aiIndex[' + i + '] = ' + iIndex); if (isWithinQuotes(iIndex)) { if (bIncludeDelim) iTokens -= 2; else iTokens -= 1; } } countTokens()方法檢查子串是否包含雙引號(hào)。如果包含,那么它減少總數(shù)并把索引值修改為字符串中下一個(gè)雙引號(hào)出現(xiàn)的位置(如上面的代碼片斷所示)。如果bReturnTokens是false,那么它從總數(shù)減去輸入字符串中出現(xiàn)的非連續(xù)分隔符的數(shù)量。 // 如發(fā)現(xiàn)多個(gè)連續(xù)的分隔符,則返回''作為標(biāo)記 if ( (sPrevToken.equals(sDelim)) && (sToken.equals(sDelim)) ) { sPrevToken = sToken; iTokenNo++; return ''; } // 檢查標(biāo)記本身是否等于分隔符 if ( (sToken.trim().startsWith(''')) && (sToken.length() == 1) ) { // 標(biāo)記本身等于分隔符的特殊情況 String sNextToken = oTokenizer.nextToken(); while (!sNextToken sToken += sNextToken; sPrevToken = sToken; iTokenNo++; return sToken.substring(1, sToken.length()-1); } // 檢查字符串中是否包含子串 else if ( (sToken.trim().startsWith(''')) && (!((sToken.trim().endsWith(''')) && (!sToken.trim().endsWith('''')))) ) { if (oTokenizer.hasMoreTokens()) { String sNextToken = oTokenizer.nextToken(); // 檢查'''' while (!((sNextToken.trim().endsWith(''')) && (!sNextToken.trim().endsWith(''''))) ) { sToken += sNextToken; if (!oTokenizer.hasMoreTokens()) { sNextToken = ''; break; } sNextToken = oTokenizer.nextToken(); } sToken += sNextToken; } } nextToken()方法通過(guò)StringTokenizer.nextToken方法獲取標(biāo)記,并檢查標(biāo)記中的雙引號(hào)字符。如果發(fā)現(xiàn)了這些字符,它繼續(xù)獲取標(biāo)記直至不能再找到帶有雙引號(hào)的標(biāo)記。另外,它還把標(biāo)記保存到一個(gè)變量(sPrevToken,參見本文后面完整的源代碼)以檢查連續(xù)出現(xiàn)的分隔符。如果nextToken()發(fā)現(xiàn)等同于分隔符的連續(xù)多個(gè)標(biāo)記,那么它返回''(長(zhǎng)度為0的字符串)作為標(biāo)記。 按照類似的方法,hasMoreTokens()方法檢查已經(jīng)返回的標(biāo)記數(shù)量是否小于標(biāo)記的總數(shù)量。 【結(jié)束語(yǔ)】本文為你介紹了如何輕松地編寫一個(gè)強(qiáng)大的字符串分解器。根據(jù)本文介紹的原理,你能夠迅速編寫出復(fù)雜的字符串分解器,節(jié)省大量的開發(fā)時(shí)間 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产中文字幕一区二区三区| 精品亚洲a∨一区二区三区18| 久久精品国产精品亚洲毛片| 日本视频一区二区| 99国产一区| 欧美日韩国产综合网| 99国产精品免费视频观看| 久久毛片亚洲| 日韩在线高清| 久久激情婷婷| 亚洲婷婷在线| 性色av一区二区怡红| 丝袜国产日韩另类美女| 日韩制服丝袜先锋影音| 亚洲乱亚洲高清| 日韩精品第一| 国产情侣一区| 韩国一区二区三区视频| 国产传媒av在线| 三级小说欧洲区亚洲区| 久久国产小视频| 在线视频免费在线观看一区二区| 国产精品日韩欧美一区| 亚洲精品看片| 国产免费av国片精品草莓男男| 欧美国产不卡| 欧美日韩在线观看首页| 99成人超碰| 一本综合精品| 国产欧美日韩一区二区三区在线| 美女精品一区二区| 91精品xxx在线观看| 亚洲午夜久久久久久尤物| 亚洲欧美日韩专区| 日韩影院精彩在线| 欧美日韩亚洲一区在线观看| 精品99久久| 好吊一区二区三区| 啪啪亚洲精品| 新版的欧美在线视频| 香蕉精品视频在线观看| 蜜臀久久99精品久久久久宅男| 日韩不卡在线观看日韩不卡视频| 久久精品亚洲一区二区| 91精品国产91久久久久久黑人| 最新国产拍偷乱拍精品| 日韩av一区二区在线影视| 国产一区二区三区久久久久久久久| 99久久九九| 日韩一区二区三区精品视频第3页| 国产欧美亚洲一区| 欧美日中文字幕| 日韩高清一区二区| 日韩精品专区| 蜜桃视频一区二区三区 | 国产精品www994| 成人久久久久| 国产日本久久| 91精品成人| 久久99偷拍| 午夜一级久久| 国产91欧美| 午夜天堂精品久久久久| 久久精品二区亚洲w码| 激情欧美亚洲| 国产精品久久久久9999高清| 久久在线免费| 另类综合日韩欧美亚洲| 亚洲美洲欧洲综合国产一区 | 免费亚洲婷婷| 91久久黄色| 国产在线观看91一区二区三区| 日韩影院精彩在线| 日韩啪啪电影网| 日韩av不卡一区二区| 欧美中文一区二区| 中文字幕一区二区三区四区久久| 精品精品国产三级a∨在线| 男人操女人的视频在线观看欧美| 久久精品国产99国产| 亚洲精品精选| 三级小说欧洲区亚洲区| 国产精品久久国产愉拍| 视频一区欧美精品| www.51av欧美视频| 久久国产日韩欧美精品| 在线亚洲观看| 日本精品不卡| 国产精品www.| 亚洲精品在线国产| 午夜日韩在线| 风间由美中文字幕在线看视频国产欧美| 亚洲美女91| 樱桃成人精品视频在线播放| 美女av在线免费看| 国产高清精品二区| 亚洲精品系列| 亚洲一区二区三区免费在线观看| 黄色aa久久| 免费在线欧美黄色| 91精品福利观看| 在线观看亚洲精品福利片| 成人精品亚洲| 日韩天堂在线| 国产一区二区三区网| 国产精品久久久久77777丨| 麻豆成人在线| 国产亚洲在线观看| 欧美久久精品一级c片| 伊伊综合在线| 国产成人精品一区二区免费看京 | 九九99久久精品在免费线bt| 中文字幕免费一区二区| 99国产精品| 日韩一级欧洲| 亚洲欧洲一区二区天堂久久| 99热国内精品| 在线视频观看日韩| 天堂日韩电影| 日韩欧美精品综合| 涩涩av在线| 日韩免费av| 黑人精品一区| 亚洲精品88| 欧美日韩一二三四| 欧美精品一区二区三区精品| 91精品久久久久久久久久不卡| 中文在线а√天堂| 精精国产xxxx视频在线野外| 亚洲不卡系列| 99久久久久国产精品| 韩日一区二区三区| 亚洲精品1区2区| 欧美成人高清| 一区在线观看| 亚洲婷婷丁香| 日本久久二区| 欧美精品第一区| 久久精品九色| 亚洲欧洲美洲av| 亚洲午夜久久久久久尤物| 日韩午夜高潮| 日本成人在线网站| 国产精品免费99久久久| 国产精品一级| 国产一区二区三区91| 日韩久久视频| 亚洲一区二区网站| 蜜桃av一区二区在线观看| 中文字幕日韩欧美精品高清在线| 91九色综合| 久久精品国产亚洲aⅴ| 日本在线啊啊| 西西人体一区二区| 人人爱人人干婷婷丁香亚洲| 久久wwww| 日本欧美不卡| 99国内精品| 97久久中文字幕| 国产中文字幕一区二区三区| 久久久久网站| 蜜臀av亚洲一区中文字幕| 国产探花一区二区| 四虎国产精品免费观看| 在线日韩av| 日韩在线成人| 国内在线观看一区二区三区 | 高清日韩中文字幕| 激情六月综合| 91在线成人| 日韩中文在线电影| 亚洲欧美视频| 欧美aaaaaa午夜精品| 精品一区亚洲| 国产探花一区| 久久婷婷av| 日本久久一区| 日韩高清成人| 亚洲精品第一| 亚洲欧洲高清| 日本不卡不码高清免费观看 | 一区二区三区四区在线看| 亚洲精品高潮| 毛片在线网站| 涩涩涩久久久成人精品| 激情久久99| 蜜桃久久av一区| 国产一区二区三区精品在线观看| 日韩视频二区| 国产在视频一区二区三区吞精| 激情综合自拍| 国产高清精品二区| 久久亚洲欧美| 国产精品成久久久久| 亚洲综合婷婷| 日韩在线观看一区| 国产精品最新| 免费看欧美美女黄的网站| 国模精品一区| 日韩极品在线观看|