国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

改進JAVA字符串分解的方法

2019-11-18 10:42:14
字體:
來源:轉載
供稿:網友

  一、概述
    大多數java程序員都曾經使用過java.util.StringTokenizer類。它是一個很方便的字符串分解器,主要用來根據分隔符把字符串分割成標記(Token),然后按照請求返回各個標記。這個過程稱為Tokenization,實際上就是把字符序列轉換成應用程序能夠理解的多個標記。
    雖然StringTokenizer用起來很方便,但它的功能卻很有限。這個類只是簡單地在輸入字符串中查找分隔符,一旦找到了分隔符就分割字符串。它不會檢查分隔符是否在子串之中這類條件,當輸入字符串中出現兩個連續的分隔符時,它也不會返回""(字符串長度為0)形式的標記。
    為了突破這些局限,Java 2平臺提供了BreakIterator類,它是在StringTokenizer之上改進的字符串分解器。由于JDK 1.1.x沒有提供這個類,為了滿足自己的需要,開發者經?;ㄙM很多時間從頭開始編寫分解器。在涉及到數據格式化處理的大型工程中,這類定制的字符串分解器有時隨處可見,而且這種情況并不罕見。
    本文的目標是幫助你利用現有的StringTokenizer類,編寫一個高級字符串分解器。
  
  二、StringTokenizer的局限
    你可以用以下三種構造函數中的任意一種創建StringTokenizer分解器:
  StringTokenizer(String sInput):以空白字符(“ ”,“/t”,“/n”)為分隔符分割字符串。
  StringTokenizer(String sInput, String sDelimiter):以sDelimiter為分隔符分割字符串。
  StringTokenizer(String sInput, String sDelimiter, boolean bReturnTokens):以sDelimiter為分隔符分割字符串,但假如bReturnTokens為true,則分隔符也作為標記返回。
    第一個構造函數不檢查輸入字符串是否包含子串。例如,假如以空白字符為分隔符分割“hello. Today /"I am /" going to my home town”,則字符串分解結果是hello.、Today、"I、am、"、going等,而不是hello.、Today、"I am "、going等。
  
    第二個構造函數不檢查兩個分隔符連續出現的情況。例如,假如以“,”為分隔符分割“book, author, publication,,,date published”這個字符串,則StringTokenizer返回book、author、publication和date published這四個標記,而不是book、author、publication、""、""和date published這6個標記(其中""表示0長度字符串)。要得到6個標記的答案,你必須把StringTokenizer的bReturnTokens參數設置為true。
    答應設置值為true的bReturnTokens參數是一個重要的功能,因為它考慮到了分隔符連續出現的情況。例如,使用第二個構造函數時,假如數據是動態收集得到而且要用來更新數據庫中的表,輸入字符串中的標記對應著表里面列的值,那么當我們不能確定哪一個列應該設置為""時,我們就無法把輸入串中的標記映射到數據庫列。假設我們要把記錄插入到一個有6個列的表,而輸入數據中包含兩個連續的分隔符。此時,StringTokenizer的分解結果是5個標記(兩個連續的分隔符代表""標記,它將被StringTokenizer忽略),而我們卻有6個字段需要設置。同時,我們也不知道連續分隔符在哪里出現,所以也就不知道哪一個列應該設置成""。
    當標記本身等同于分隔符(無論是長度還是值)且位于子串之內時,第三個構造函數無效。例如,假如我們要以“,”為分隔符分解字符串“book, author, publication,/",/",date published”(這個字符串包含一個“,”標記,它與分隔符一樣),結果是book、author、publication、"、"、date published這六個標記,而不是book、author、publication、,(逗號字符)、date published這五個標記。再提醒一下,即使我們把StringTokenizer的bReturnTokens參數設置設置成了true,在這種情況下也沒有什么幫助。
  
  三、高級字符串分解器
    在編寫代碼之前,你必須搞清楚一個好的分解器有哪些基本要求。因為Java開發者已經習慣于使用StringTokenizer類,所以一個好的分解器應該提供StringTokenizer類提供的所有實用方法,比如hasMoreTokens()、nextToken()、countTokens()。
    本文提供的代碼很簡單,而且大部分代碼足以自我解釋。在這里,我主要利用了StringTokenizer類(創建類實例時bReturnTokens參數設置為true),并提供了上面提到的幾個方法。大多數時候標記與分隔符不同,有些時候分隔符卻要作為標記輸出(盡管非常罕見),此時假如出現了對標記的請求,分解器要把分隔符作為標記輸出。創建PowerfulTokenizer對象時,你只需要提供輸入字符串和分隔符這兩個參數,PowerfulTokenizer將在內部使用bReturnTokens設置成true的StringTokenizer。(這么做的原因在于,假如不是用bReturnTokens設置成true的方式創建StringTokenizer,那么它將在解決先前提出的問題時受到限制)。為了正確地控制分解器,代碼在幾個地方(計算標記的總數量以及nextToken())檢查bReturnTokens是否設置成了true。
    你可能已經發現,PowerfulTokenizer實現了Enumeration接口,從而也就實現了hasMoreElements()和nextElement()這兩個方法,而這兩個方法又分別把調用直接委托給hasMoreTokens()和nextToken()。(由于實現了Enumeration接口,PowerfulTokenizer實現了與StringTokenizer的向后兼容。)
    我們來看一個例子,假設輸入字符串是“hello, Today,,, /"I, am /", going to,,, /"buy, a, book/"”,分隔符是“,”。用分解器分割這個字符串時返回結果如表1所示:
  表1:字符串分解結果
    輸入字符串包含11個逗號(,)字符,其中3個在子串里面、4個連續出現(“Today,,,”中包含兩個連續逗號,第一個逗號是Today的分隔符)。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 隆化县| 扬州市| 郸城县| 赞皇县| 靖边县| 孟连| 武宁县| 丽水市| 西青区| 永济市| 安泽县| 留坝县| 怀安县| 福安市| 通河县| 元江| 许昌县| 集贤县| 民乐县| 平泉县| 溧阳市| 揭东县| 孟连| 黔东| 湖南省| 牟定县| 博乐市| 纳雍县| 宣威市| 潜江市| 枣阳市| 溧阳市| 英德市| 海原县| 平江县| 营山县| 兴安盟| 吉木萨尔县| 天全县| 巍山| 龙川县|