StringTokenizer:
熟悉的分解对象,有 String 类的 split() 方法,而与它不同的是,StringTokenizer 对象是不使用正则表达式作为分隔标记的,通过本次的学习,来使用 StringTokenizer 对象进行对 String 对象的字符序列分解。
1、StringTokenizer的常用构造方法:
当分析一个 String 对象的字符序列并将其分解成可被独立使用的单词(也叫语言符号)时,可以使用 java.util 包中的 StringTokenizer 类,该类有两个常用的构造方法:
- StringTokenizer(String s):为 String 对象 s 构造一个分析器,使用默认的分隔标记(空格、换行、回车、Tab等符号);
- StringTokenizer(String s, String delim):为 String 对象 s 构造一个分析器,参数 delim 的字符序列中的字符的任意排列被作为分隔标记。
StringTokenizer a = new StringTokenizer("Go All Out!");
// 分隔出三个单词:Go、All、Out!
StringTokenizer a1 = new StringTokenizer("Go!_!All_!Out!","_!");
// 以"_!"的任意排列为分隔标记,分隔出三个单词:Go、All、Out
2、nextToken():获取分析器中的一个语言符号
以一个 StringTokenizer 对象称为一个字符串分析器,一个分析器可以使用 nextToken() 方法逐个获取 String 对象的字符序列中的语言符号,每单调用 nextToken() 时,都会获取 String 对象的字符序列中的一个语言符号,每获取一个语言符号,字符串分析器中负责计数的变量的值就会自动减1,该计数变量的初始值就等于获取的语言符号的数量。
3、hasMoreToken():获取分析器中的计数变量的值
获取语言符号时,通常采用while循环进行逐个获取,但为了控制循环,可使用 StringTokenizer 类中的 hasMoreToken() 方法,只要字符序列中还有语言符号,即计数变量的值大于0,那么该方法就会返回 true ,否则返回 false 。
举例:
StringTokenizer a = new StringTokenizer("Go All Out!");
// 分隔出三个单词:Go、All、Out!
StringTokenizer a1 = new StringTokenizer("Go!_!All_!Out!","_!");
// 以"_!"的任意排列为分隔标记,同样分隔出三个单词:Go、All、Out
System.out.println(a.countTokens());
while (a.hasMoreTokens()){
System.out.print(a.nextToken());
}
System.out.println();
System.out.println(a1.countTokens());
while (a1.hasMoreTokens()){
System.out.print(a1.nextToken());
}
结果:
Scanner:
1、useDelimiter():正则表达式进行分隔字符序列
当使用 Scanner 对象进行解析字符序列中的语言符号时,可以使用 useDelimiter(正则表达式) 方法将正则表达式作为分隔标记,Scanner 对象默认用空白字符(空格、制表符、回车)作为分隔标记来解析 String 对象的字符序列中的语言符号。
2、next():依次返回被解析的字符序列中的语言符号
- 如果最后一个语言符号已被 next() 返回,Scanner 对象调用 hasNext() 将返回 false ,否则返回 true;
- Scanner 对象可以调用 nextInt() 或 nextDouble() 方法来代替 next() 方法来将数字型语言符号转化为 int 或 double 型数据返回;
- 如果获取的不是数字型语言符号,调用 nextInt() 或 nextDouble() 方法将发生 InputMismatchException 异常,处理异常时可以调用 next() 方法返回非数字语言符号。
举例:
Scanner scanner = new Scanner("Go All Out!123");
scanner.useDelimiter("[0-9! ]+");
double sum = 0;
int sum1 = 0;
// 分隔出三个单词:Go、All、Out!
while (scanner.hasNext()){
try {
double num = scanner.nextDouble();
System.out.println(num);
sum += num;
} catch(InputMismatchException e){
System.out.println(scanner.next());
sum1 ++;
}
}
System.out.println(sum1);
结果:
StringTokenizer 与 Scanner 的区别:
1、StringTokenizer 类把分解出的全部单词都存放到 StringTokenizer 对象的实体中,因此能较快速度的获得语言符号,即占用较多的内存(空间换取速度);
2、Scanner 类不把单词存放到对象当中,而是仅仅存放怎么获取语言符号的分隔标记,因此 Scanner 对象获得语言符号的速度相对较慢,即节省内存空间(速度换取空间)。