StringTokenizer
尽量并不须要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。