Skip to content

java StreamTokenizer使用

约 480 字大约 2 分钟

2020-07-20

用JAVA解题一般用Scanner类来进行输入,但对时间要求严格的题,用它可能会超时,我就遇到这样的问题,后改用StreamTokenizer类进行输入,就过了。看来后者处理输入的效率要高点。

关键点

  1. java.io.StreamTokenizer类可以获取输入流并将其分析为Token(标记)。StreamTokenizer的nextToken方法将读取下一个标记
  2. 默认情况下,StreamTokenizer认为下列内容是Token:字母数字、除C和C++注释符号以外的其他符号。如符号“/”不是Token,注释后的内容也不是,而“\”是Token。单引号和双引号以及其中的内容,只能算是一个Token。
  3. 要统计文件的字符数,不能简单地统计Token数,因为字符数不等于Token,按照Token的规定,引号中的内容就算是10页也算是一个Token。如果希望引号和引号中的内容都算作Token,应该通过StreamTokenizer的ordinaryCha方法将单引号和双引号当做普通字符处理。

用法

TT_WORD(-3):	单词。String类型 	sval存储了该单词。 
TT_NUMBER(-2):	数。double类型	nval保存该数值。只能识别十进制浮点数。
TT_EOL("\n"):	行结束。 
TT_EOF(-1):	文件结束。

提取数字

StreamTokenizer stk = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
// 指定此标记生成器应解析数字
stk.parseNumbers();
int nextToken = stk.nextToken();
while (nextToken != StreamTokenizer.TT_EOF) {// 文件结束退出循环
    if (nextToken == StreamTokenizer.TT_NUMBER)// 判断是否是数。double类型。只能识别十进制浮点数。
        // stk.nval默认解析出的格式是double
        System.out.println("number " + stk.nval + " on line " + stk.lineno());
    nextToken = stk.nextToken();
}

字符串提取

StreamTokenizer stk = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
int nextToken = stk.nextToken();
while (nextToken != StreamTokenizer.TT_EOF) {// 文件结束退出循环
    if (nextToken == StreamTokenizer.TT_WORD)// 判断是否是字符串
        // stk.sval 默认解析出的格式是String
        System.out.println("number " + stk.sval + " on line " + stk.lineno());
    nextToken = stk.nextToken();
}