亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? 改進(jìn)java字符串分解的方法.txt

?? 含有許多JAVA的技巧!
?? TXT
字號(hào):
改進(jìn)JAVA字符串分解的方法 
(加入日期:2001-7-1 點(diǎn)擊數(shù):975)
【對(duì)此文發(fā)表評(píng)論】 【編程愛好者論壇】 【保存文章至硬盤】 【打印文章】 
 
 一、概述   
  
  大多數(shù)Java程序員都曾經(jīng)使用過java.util.StringTokenizer類。它是一個(gè)很方便的字符串分解器,主要用來根據(jù)分隔符把字符串分割成標(biāo)記(Token),然后按照請(qǐng)求返回各個(gè)標(biāo)記。這個(gè)過程稱為Tokenization,實(shí)際上就是把字符序列轉(zhuǎn)換成應(yīng)用程序能夠理解的多個(gè)標(biāo)記。   
  
  雖然StringTokenizer用起來很方便,但它的功能卻很有限。這個(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沒有提供這個(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)收集得到而且要用來更新數(shù)據(jù)庫(kù)中的表,輸入字符串中的標(biāo)記對(duì)應(yīng)著表里面列的值,那么當(dāng)我們不能確定哪一個(gè)列應(yīng)該設(shè)置為""時(shí),我們就無法把輸入串中的標(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)記本身等同于分隔符(無論是長(zhǎng)度還是值)且位于子串之內(nèi)時(shí),第三個(gè)構(gòu)造函數(shù)無效。例如,如果我們要以“,”為分隔符分解字符串“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,在這種情況下也沒有什么幫助。   
  
三、高級(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,那么它將在解決先前提出的問題時(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的向后兼容。)   
  
  我們來看一個(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ì)我們來說沒有用,上面的公式為我們返回了標(biāo)記的總數(shù)量(9)。   
  請(qǐng)記住這兩個(gè)公式,它們是PowerfulTokenizer的核心。這兩個(gè)公式適用于幾乎所有它們各自條件下的情形。但是,如果你有更復(fù)雜的要求,不能使用這兩個(gè)公式,那么你應(yīng)該在編寫代碼之前分析各種可能出現(xiàn)的情況,并設(shè)計(jì)出自己的公式。   
  
  
// 檢查分隔符是否位于子串之內(nèi)  
for (int i=1; i<aiIndex.length; 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.trim().endsWith("\"")) {  
sToken += sNextToken;  
sNextToken = oTokenizer.nextToken();  
}  
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()方法通過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é)束語】本文為你介紹了如何輕松地編寫一個(gè)強(qiáng)大的字符串分解器。根據(jù)本文介紹的原理,你能夠迅速編寫出復(fù)雜的字符串分解器,節(jié)省大量的開發(fā)時(shí)間。

本欄文章均來自于互聯(lián)網(wǎng),版權(quán)歸原作者和各發(fā)布網(wǎng)站所有,本站收集這些文章僅供學(xué)習(xí)參考之用。任何人都不能將這些文章用于商業(yè)或者其他目的。( ProgramFan.Com ) 

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人tv网| 欧美猛男超大videosgay| 国产毛片精品视频| 国产一区二区三区蝌蚪| 国产在线播放一区二区三区| 精东粉嫩av免费一区二区三区| 日韩精品免费视频人成| 日韩 欧美一区二区三区| 丝袜美腿亚洲一区| 久久99在线观看| 国产精品456| 国产成+人+日韩+欧美+亚洲| 99久久99久久综合| 欧美亚洲动漫精品| 91精品免费观看| 精品1区2区在线观看| 久久久久久久久久久久久女国产乱 | 韩国在线一区二区| 国产成人综合在线| 91视频.com| 欧美人牲a欧美精品| 欧美一级日韩免费不卡| 久久九九影视网| 国产精品久久久久久户外露出 | 国产成人亚洲精品青草天美 | 精品久久久久久亚洲综合网| 久久综合九色综合欧美亚洲| 国产精品入口麻豆九色| 一区二区三区波多野结衣在线观看| 欧美精品一区二区三| 日本一区二区三区国色天香| 蜜桃av一区二区在线观看| 色综合天天在线| 久久久亚洲高清| 欧美aaa在线| 欧美天堂一区二区三区| 国产精品乱码一区二区三区软件 | 精品国偷自产国产一区| 亚洲大片在线观看| 色综合久久久久综合体| 中文字幕欧美国产| 国模大尺度一区二区三区| 6080yy午夜一二三区久久| 亚洲欧美日韩国产成人精品影院| 国产乱一区二区| 欧美一级夜夜爽| 亚洲18影院在线观看| 99精品欧美一区二区三区综合在线| 久久综合久久鬼色| 精品一区二区三区香蕉蜜桃 | 天天综合网天天综合色| 色婷婷综合久久| 中文字幕av一区二区三区高| 国产精品456露脸| 精品成人免费观看| 欧美aaaaaa午夜精品| 欧美日韩国产成人在线免费| 夜夜嗨av一区二区三区网页| 99精品欧美一区二区三区小说| 国产日韩欧美精品电影三级在线| 国产精品综合在线视频| 欧美精品一区二区三区蜜桃| 激情欧美日韩一区二区| 精品久久久久久久人人人人传媒 | 精品国产三级a在线观看| 蜜臀精品一区二区三区在线观看| 欧美肥大bbwbbw高潮| 日韩精品视频网| 91精品国产91久久久久久一区二区| 亚洲国产一区在线观看| 欧美日韩一区二区三区在线看| 一卡二卡欧美日韩| 欧美综合久久久| 亚洲高清免费一级二级三级| 欧美日韩免费视频| 天天亚洲美女在线视频| 日韩欧美一级精品久久| 极品美女销魂一区二区三区| 亚洲精品一区二区三区香蕉| 国产精品99久久久| 国产日韩欧美综合一区| 成人午夜在线视频| 亚洲老妇xxxxxx| 欧美体内she精高潮| 日本成人在线电影网| 欧美哺乳videos| 国产成都精品91一区二区三| 自拍av一区二区三区| 在线精品视频小说1| 日韩精品色哟哟| 久久综合丝袜日本网| 成人免费毛片a| 亚洲已满18点击进入久久| 欧美日本一道本在线视频| 老司机免费视频一区二区| 久久久精品黄色| 91网站最新地址| 视频一区国产视频| 久久综合久久久久88| 99久久精品情趣| 无码av免费一区二区三区试看| 欧美va日韩va| 99久久婷婷国产综合精品电影| 亚洲综合一区二区| 日韩精品中文字幕在线不卡尤物| 成人性生交大片免费看中文| 亚洲亚洲人成综合网络| 日韩欧美久久一区| 99热在这里有精品免费| 同产精品九九九| 久久久影院官网| 欧美在线一二三四区| 国产一区二区毛片| 亚洲精品视频自拍| 精品三级在线看| 懂色av一区二区在线播放| 性做久久久久久免费观看欧美| 精品国产乱码久久久久久闺蜜| 色综合久久久久久久久| 看国产成人h片视频| 国产精品二三区| 日韩精品一区二区三区中文不卡 | 亚洲国产日韩综合久久精品| 久久午夜电影网| 欧美色爱综合网| 成人午夜在线免费| 美女网站在线免费欧美精品| 亚洲视频一二三区| 精品国产乱码久久久久久蜜臀| 欧美综合天天夜夜久久| 国产成人在线免费观看| 日韩av中文字幕一区二区| 中文字幕在线一区免费| 精品嫩草影院久久| 色屁屁一区二区| 福利一区福利二区| 老司机午夜精品99久久| 亚洲永久免费av| 日本一二三不卡| 日韩三区在线观看| 欧美日韩久久久| 91麻豆免费观看| 粉嫩嫩av羞羞动漫久久久| 日韩成人dvd| 夜夜操天天操亚洲| 国产精品入口麻豆九色| 日韩免费视频一区二区| 欧美日韩一区二区电影| 99re这里都是精品| 国产成人av福利| 美美哒免费高清在线观看视频一区二区| 亚洲日本一区二区三区| 亚洲国产电影在线观看| 久久精品亚洲国产奇米99| 欧美一级片在线| 欧美精品少妇一区二区三区| 在线视频中文字幕一区二区| 成人激情小说乱人伦| 国产精华液一区二区三区| 精品亚洲欧美一区| 久久爱www久久做| 美女视频网站久久| 午夜亚洲国产au精品一区二区| 亚洲精品乱码久久久久| 136国产福利精品导航| 国产精品麻豆久久久| 国产色婷婷亚洲99精品小说| 久久香蕉国产线看观看99| 欧美大片免费久久精品三p| 欧美一级日韩免费不卡| 欧美一区二区三区免费视频| 欧美久久久久久久久| 欧美日韩三级在线| 欧美视频在线播放| 欧美在线不卡视频| 欧美亚洲综合久久| 欧美视频一区二区三区| 欧美性色综合网| 欧美三级一区二区| 欧美另类变人与禽xxxxx| 在线电影院国产精品| 91精选在线观看| 日韩午夜在线影院| 日韩欧美综合在线| 精品噜噜噜噜久久久久久久久试看 | 亚洲美女视频一区| 亚洲免费观看高清完整版在线观看 | 毛片av一区二区三区| 免费看日韩a级影片| 麻豆成人久久精品二区三区红| 日av在线不卡| 国产一区二区精品在线观看| 国产高清精品网站| 成人av中文字幕| 色综合久久99| 欧美高清激情brazzers| 欧美一区二区视频观看视频| 精品欧美久久久| 中文欧美字幕免费| 亚洲精品久久久久久国产精华液|