本章将通过浏览那些不属于类集框架的类和接口的方式来继续研究java.util。这其中包括了标记字符串,处理日期,计算随机数以及观测事件。也包括了在本章后面简要提及的java.util.zip包和java.util.jar包。
16.1 StringTokenizer(字符串标记)
对文本的处理经常包括对格式化的输入字符串进行语法分析。语法分析(Parsing)将文本划分为一组不连续的部分,或标记(tokens),在一个确定的序列中,标记可以表达语义。StringTokenizer类提供了语法分析处理的第一步。经常被称为lexer(词法分析程序)或scanner(扫描程序)。StringTokenizer实现枚举(Enumeration)接口。因此,给定一个输入字符串,可以使用StringTokenizer对包含于其中的单独标记进行枚举。使用StringTokenizer时,指定一个输入字符串和一个包含了分割符的字符串。分割符(Delimiters)是分割标记的字符。分割符字符串中的每一个字符被当做一个有效的分割符——例如,“,;:”建立逗号,分号和冒号分割符。默认建立的分割符有空白符字符,空格,tab键,换行以及回车。
StringTokenizer的构造函数如下所示:
StringTokenizer(String str)
StringTokenizer(String str, String delimiters)
StringTokenizer(String str, String delimiters, boolean delimAsToken)
在上述三种形式中,str都表示将被标记的字符串。在第一种形式中,使用默认的分割符。在第二种和第三种形式中,delimiters是用来指定分割符的一个字符串。在第三种形式中,如果delimAsToken为true,当字符串被分析时,分割符也被作为标记而被返回;否则,不返回分割符。在第一种和第二种形式中,分割符不会作为标记而被返回。一旦创建了StringTokenizer对象之后,nextToken( )方法被用于抽取连续的标记。当有更多的标记被抽取时,hasMoreTokens( )方法返回true。因为StringTokenizer实现枚举(Enumeration),因此hasMoreElements( )和nextElement( )方法也被实现,同时它们的作用也分别与hasMoreTokens( )和nextToken( )方法相同。StringTokenizer方法列在表16-1中。下面是一个创建用于分析“key=value”对的StringTokenizer的例子。连续的多组“key=value”对将用分号分开。
// Demonstrate StringTokenizer.
import java.util.StringTokenizer;
class STDemo {
static String in = "title=Java: The Complete Reference;" +
"author=Schildt;" +
"publisher=Osborne/McGraw-Hill;" +
"copyright=2001";
public static void main(String args[]) {
StringTokenizer st = new StringTokenizer(in, "=;");
while(st.hasMoreTokens()) {
String key = st.nextToken();
String val = st.nextToken();
System.out.println(key + "\t" + val);
}
}
}
表16-1 由StringTokenizer 定义的方法
方法 描述
int countTokens( ) 使用当前分割符集,该方法确定还没被分析的标记的个数并返回结果
boolean hasMoreElements( ) 如果在字符串中包含有一个或多个标记,则返回true;如果在字符串中不包含标记,则返回false
boolean hasMoreTokens( ) 如果在字符串中包含有一个或多个标记,则返回true;如果在字符串中不包含标记,则返回false
Object nextElement( ) 将下一个标记作为Object返回
String nextToken( ) 将下一个标记作为String返回
String nextToken(String delimiters) 将下一个标记作为String 返回并且将分割符字符串设为由delimiters指定的字符串
该程序的输出如下所示:
title Java: The Complete Reference
author Schildt
publisher Osborne/McGraw-Hill
copyright 2001
16.2 BitSet(置位)
BitSet类创建一个专用类型的数组,该数组包含位的值。而该数组的大小可以按需要进行增加。这使得它与位矢量相似。BitSet的构造函数如下所示:
BitSet( )
BitSet(int size)
第一种形式创建一个默认的对象。第二种形式允许指定其初始大小(也就是说,它所能包含的位的个数)。所有的位被初始化为0。BitSet实现Cloneable接口并且定义了表16-2中列出的方法。
表16-2 由BitSet 定义的方法
方法 描述
void and(BitSet bitSet) 将调用BitSet对象的内容与由bitSet指定的那些内容进行相与(AND)运算,结果被放置在调用对象中void andNot(BitSet bitSet) 对应bitSet中的每一位,清除调用BitSet中相应的位(在Java 2中新增加的)
void clear(int index) 对由index指定的位进行置0
Object clone( ) 复制调用BitSet对象
Boolean equals(Object bitSet) 如果调用位集合与由bitSet传递的位集合相等,则返回true;否则,该方法返回false
Boolean get(int bitIndex) 返回指定下标处位的当前状态
int hashCode( ) 返回调用对象的散列值
int length( ) 返回包含调用BitSet的内容所需的位的个数。该值由最后1位的位置确定(在Java 2中新增加的)
void or(BitSet bitSet) 将调用对象的内容与由bitSet指定的内容进行“或”(OR)运算,结果被放置在调用对象中
void set(int index) 设置由index指定的位
int size( ) 返回调用BitSet对象中位的个数
String toString( ) 返回调用BitSet对象的字符串等价形式
void xor(BitSet bitSet) 将调用BitSet对象的内容与由bitSet指定的内容进行“异或”(XOR)运算,结果被放置在调用对象中
这里是一个说明BitSet的例子。
// BitSet Demonstration.
import java.util.BitSet;
class BitSetDemo {
public static void main(String args[]) {
BitSet bits1 = new BitSet(16);
BitSet bits2 = new BitSet(16);
// set some bits
for(int i=0; i<16; i++) {
if((i%2) == 0) bits1.set(i);
if((i%5) != 0) bits2.set(i);
}
System.out.println("Initial pattern in bits1: ");
System.out.println(bits1);
System.out.println("\nInitial pattern in bits2: ");
System.out.println(bits2);
// AND bits
bits2.and(bits1);
System.out.println("\nbits2 AND bits1: ");
System.out.println(bits2);
// OR bits
bits2.or(bits1);
System.out.println("\nbits2 OR bits1: ");
System.out.println(bits2);
// XOR bits
bits2.xor(bits1);
System.out.println("\nbits2 XOR bits1: ");
System.out.println(bits2);
}
}
下面是该程序的输出。当用toString( )方法将一个BitSet对象转换成其相应的字符串形
式后,每组位就由其位置表示。被清除的位将不被显示。
Initial pattern in bits1:
{0, 2, 4, 6, 8, 10, 12, 14}
Initial pattern in bits2:
{1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14}
bits2 AND bits1:
{2, 4, 6, 8, 12, 14}
bits2 OR bits1:
{0, 2, 4, 6, 8, 10, 12, 14}
bits2 XOR bits1:
{}
1
2
3
4
5
6
下一页>>