程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> StringTokenizer

StringTokenizer

編輯:關於JAVA

盡管並不必要IO庫的一部分,但StringTokenizer提供了與StreamTokenizer極相似的功能,所以在這裡一並講述。
StringTokenizer的作用是每次返回字串內的一個記號。這些記號是一些由制表站、空格以及新行分隔的連續字符。因此,字串“Where is my cat?”的記號分別是“Where”、“is”、“my”和“cat?”。與StreamTokenizer類似,我們可以指示StringTokenizer按照我們的願望分割輸入。但對於StringTokenizer,卻需要向構建器傳遞另一個參數,即我們想使用的分隔字串。通常,如果想進行更復雜的操作,應使用StreamTokenizer。
可用nextToken()向StringTokenizer對象請求字串內的下一個記號。該方法要麼返回一個記號,要麼返回一個空字串(表示沒有記號剩下)。
作為一個例子,下述程序將執行一個有限的句法分析,查詢鍵短語序列,了解句子暗示的是快樂亦或悲傷的含義。
 

//: AnalyzeSentence.java
// Look for particular sequences
// within sentences.
import java.util.*;

public class AnalyzeSentence {
  public static void main(String[] args) {
    analyze("I am happy about this");
    analyze("I am not happy about this");
    analyze("I am not! I am happy");
    analyze("I am sad about this");
    analyze("I am not sad about this");
    analyze("I am not! I am sad");
    analyze("Are you happy about this?");
    analyze("Are you sad about this?");
    analyze("It's you! I am happy");
    analyze("It's you! I am sad");
  }
  static StringTokenizer st;
  static void analyze(String s) {
    prt("\nnew sentence >> " + s);
    boolean sad = false;
    st = new StringTokenizer(s);
    while (st.hasMoreTokens()) {
      String token = next();
      // Look until you find one of the
      // two starting tokens:
      if(!token.equals("I") &&
         !token.equals("Are"))
        continue; // Top of while loop
      if(token.equals("I")) {
        String tk2 = next();
        if(!tk2.equals("am")) // Must be after I
          break; // Out of while loop
        else {
          String tk3 = next();
          if(tk3.equals("sad")) {
            sad = true;
            break; // Out of while loop
          }
          if (tk3.equals("not")) {
            String tk4 = next();
            if(tk4.equals("sad"))
              break; // Leave sad false
            if(tk4.equals("happy")) {
              sad = true;
              break;
            }
          }
        }
      }
      if(token.equals("Are")) {
        String tk2 = next();
        if(!tk2.equals("you"))
          break; // Must be after Are
        String tk3 = next();
        if(tk3.equals("sad"))
          sad = true;
        break; // Out of while loop
      }
    }
    if(sad) prt("Sad detected");
  }
  static String next() {
    if(st.hasMoreTokens()) {
      String s = st.nextToken();
      prt(s);
      return s;
    } 
    else
      return "";
  }
  static void prt(String s) {
    System.out.println(s);
  }
} ///:~

對於准備分析的每個字串,我們進入一個while循環,並將記號從那個字串中取出。請注意第一個if語句,假如記號既不是“I”,也不是“Are”,就會執行continue(返回循環起點,再一次開始)。這意味著除非發現一個“I”或者“Are”,才會真正得到記號。大家可能想用==代替equals()方法,但那樣做會出現不正常的表現,因為==比較的是句柄值,而equals()比較的是內容。
analyze()方法剩余部分的邏輯是搜索“I am sad”(我很憂傷、“I am nothappy”(我不快樂)或者“Are you sad?”(你悲傷嗎?)這樣的句法格式。若沒有break語句,這方面的代碼甚至可能更加散亂。大家應注意對一個典型的解析器來說,通常都有這些記號的一個表格,並能在讀取新記號的時候用一小段代碼在表格內移動。
無論如何,只應將StringTokenizer看作StreamTokenizer一種簡單而且特殊的簡化形式。然而,如果有一個字串需要進行記號處理,而且StringTokenizer的功能實在有限,那麼應該做的全部事情就是用StringBufferInputStream將其轉換到一個數據流裡,再用它創建一個功能更強大的StreamTokenizer。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved