Java: StringTokenizer类与Scanner类的运用

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 对象获得语言符号的速度相对较慢,即节省内存空间(速度换取空间)。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值