StringTokenizer类
首先要知道Tokenizer是分词器的意思,所以它的作用是将StringTokenizer类的对象的字符序列进行分解
StringTokenizer类有两个构造方法
StringTokenizer(String s)
//构造一个StringTokenizer对象,名称自定,例如fenxi,磨人的分隔标记(空格,换行,回车,tab)
StringTokenizer fenxi = new StringTokenizer("how are you");
StrintTokenizer(String s,String delim)
//delim就是自定义的分隔标记
StringTokenizer fenxi = new StringTokenizer("how are,you",",");
需要注意的是任意排列的仍然还是分隔标记
通过对象调用StringTokenizer类中的方法
String nextToken()
//返回其对象获取到的单词,每获取一次就自动删除单词boolean hasMoreToken()
//返回一个布尔值,只有对象中还有单词就为truecountTokens()
//返回对象拥有多少个单词的值
例子
import java.util.StringTokenizer;
public class Example9_11 {
public static void main(String[] args) {
String s = "we are student ,and"; //创建一个字符串变量
StringTokenizer fenxi = new StringTokenizer(s," ,"); //定义的分隔标志是空格或逗号
int number = fenxi.countTokens();
while(fenxi.hasMoreTokens()){ //循环
System.out.println(fenxi.nextToken()); //获取单词
System.out.println("还剩"+fenxi.countTokens()+"单词");
}
System.out.println("一共有"+number+"个单词");
}
}
运行结果
D:\HelloWorld\out\production\HelloJava TextCourse.Example9_11
we
还剩3单词
are
还剩2单词
student
还剩1单词
and
还剩0单词
一共有4个单词
通过对收费单据进行分割的例子
import java.util.StringTokenizer;
public class Example9_11 {
public static void main(String[] args) {
String s = "市话费:28.89,长途话费:128.84,上网费:1144"; //创建一个字符串变量
String regex = "[^0-9.]+"; //声明一个正则表达式(意思是除了0-9的数字和.)
s = s.replaceAll(regex,"#"); //将原先的字符串进行修改为#号
StringTokenizer fenxi = new StringTokenizer(s,"#"); //分隔开用#号的数字
double totalMoney = 0; //声明一个总价格
while(fenxi.hasMoreTokens()){
double money = Double.parseDouble(fenxi.nextToken()); //将分隔的单词转换成double再赋值
System.out.println(money);
totalMoney = totalMoney+money;
}
System.out.println("总费用是:"+totalMoney);
}
}
运行结果
D:\HelloWorld\out\production\HelloJava TextCourse.Example9_11
28.89
128.84
1144.0
总费用是:1301.73
Scanner类
怎样使用Scanner类的对象从字符序列中解析程序所需要的的数据
创建Scanner对象之前首先要给它一个String对象
String s = "市话费:28.89,长途话费:128.84,上网费:1144";
Scanner scanner = new Scanner(s);
scanner默认使用空格作为分隔标记来解析s的字符序列,也可以让对象使用useDelimiter(正则表达式)
自定义分隔标记
(delimiter是定界符的意思)
Scanner对象方法
next()
//返回对象的字符序列中的单词nextDouble()
//将数字型字符转化为double数据类型hasNext()
//能扫描到的单词返回ture,如果没有得返回就返回falsehasNextDouble()
//同上,只是更具体为double类型
通过简单例子
import java.util.Scanner;
public class example9_13 {
public static void main(String[] args) {
String s = "市话费:28.89,长途话费:128.84,上网费:1144";
Scanner scanner = new Scanner(s);
scanner.useDelimiter("[^0-9.]+"); //表示使用定界符方法(除了0~9和.出现一次或多次)
double sum = 0;
while(scanner.hasNext()){
try{ double price = scanner.nextDouble();
sum = sum + price;
System.out.println(price);
}
catch (Exception e){
String t = scanner.next(); //出现异常就将异常赋值出去
}
}
System.out.println("总费用:" + sum);
}
}
运行结果
D:\HelloWorld\out\production\HelloJava TextCourse.example9_13
28.89
128.84
1144.0
总费用:1301.73
StringTokenizer类和Scanner类的区别
- 两个类都可以用于分解字符序列中的单词,但思想上有所不同
- StringTokenizer类是将分解出的单词全部放到其对象的实体中,因此能更快速获取得单词,但就占用的内存多了
- Scanner类是将怎样分解单词的规则放到其对象的实体中,因此比较慢,但占用的内存会很少
- StringTokenizer类对象一旦诞生就可以调用countToken()返回有多少个单词
- 而Scanner类只能通过逐个获取并记录
CET4P152
ridiculous
divorce
commerce
scholarship
headquarters