实际上,将字符串划分为令牌非常有用,因此Java库包含几种不同的类来完成此任务。当然,最简单的是StringTokenizer类,它是java.util程序包的一部分。该类可以从提供给StringTokenizer构造函数的字符串中读取令牌。这样就创建了令牌赋予器(tokenizer),可以用它从原始字符串逐个读取连续的令牌。从令牌赋予器读取的一系列令牌称为令牌流。
StringTokenize类中最重要的方法如图8-13所示。StringTokenizer的构造函数以3种形式出现。最简单的形式如下面的声明所示,它从名为line的字符串值变量读取令牌:
StringTokenizer tokenizer = new StringTokenizer(line); |
使用这种形式的构造函数时,令牌赋予器使用空格和制表符--或者让Character.isWhitespace方法返回true的任何字符--将字符串划分为令牌来标记每个令牌的边界。划分令牌的空格本身不是令牌,不会作为令牌流的一部分返回。
图8-13StringTokenize类中的有用方法 |
构造函数的第二种形式允许指定划分单个令牌的字符集,这些字符称为定界符。例如,如果创建使用空格或逗号划分单个令牌的令牌赋予器,可以这样重写声明:
StringTokenizer tokenizer = new StringTokenizer(line, " ,"); |
在StringTokenizer构造函数的单参数版本中,其声明创建的令牌赋予器使用空格和逗号字符来区分令牌,但不将它们作为令牌流的一部分。按照当前的情况,PigLatin示例的伪代码需要可以返回定界符字符的扫描仪。构造函数的第三种形式提供了这种能力,它包含第三个参数,该参数可以确定是否应该将定界符作为令牌返回。如果这个参数是false,令牌赋予器会像和在双参数形式中一样操作。如果参数是true,令牌流会作为单个字符令牌包含每个定界符字符。
在PigLati程序中,需要的令牌赋予器可以将所有标点符号解释为定界符并作为令牌返回这些定界符。要创建这样的令牌赋予器,最简单的方法是定义名为DELIMITERS的命名常量(它包含所有合法标点符号),然后使用下面的代码声明令牌赋予器:
StringTokenizer tokenizer = |
声明令牌赋予器之后,调用nextToken方法来依次获得每个令牌,代码就可以从令牌流读取令牌。要确定令牌流何时结束,需要使用hasMoreTokens方法,只要还有其他令牌,它就返回true。这些方法可以用实现方法所需的实际代码取代translateLine中的大多数伪代码。如果用对仍未实现的方法isWord和translateWord的调用取代伪代码的最后剩余位,translateLine的代码如下:
private String translateLine(String line) { |