目录
一、StreamTokenizer中的基本方法
二、StreamTokenizer的构造方法
2.1 指定单词要素
2.2 指定分隔符
三、算法题用法
3.1 普通用法
3.2 多组输入
了解了上面的这些方法,那么阅读StreamTokenizer源码就很简单了,通过StreamTokenizer
private StreamTokenizer() {
// 将a-z的字符作为一个普通单词要素,即可以正常将这些字符解析
wordChars('a', 'z');
// 将A-Z的字符作为一个普通单词要素,即可以正常将这些字符解析
wordChars('A', 'Z');
// 将ASCII码表中160-255的字符作为一个普通单词要素,即可以正常将这些字符解析。一个单词(String)是通过多个单词要素(char)组成的
wordChars(128 + 32, 255);
// StreamTokenizer默认认为空白符就是分隔符
// 将ASCII码表中0-' '的字符作为空白分隔符,因为StreamTokenizer默认认为空白符就是分隔符,所以这些字符也就变成了分隔符
whitespaceChars(0, ' ');
// 将/字符作为注解符,也就是说当一个token中包括/时,/后面的字符全部不再解析
commentChar('/');
// 指定 " 为分隔符
quoteChar('"');
// 指定 ' 为分隔符
quoteChar('\'');
//当stream tokenizer遭遇到一个单词为双精度的浮点数时,会把它当作一个数字,而不是一个单词。
parseNumbers();
}
我们要注意区分whitespaceChars和quoteChar,他们两个都是指定分隔符,但是他们两个指定的分隔符是有区别的,whitespaceChars指定的分隔符是空白分隔符,我们就可以这样理解:
通过st.whitespaceChars('"', '"'); 指定 " 为空白分隔符,只要是分隔符是 " ,不管有多少个,会把所有的这个"看成是一个分隔符将字符串成功分割
但是使用quoteChar('"'); 系统是不会将多个"看成是一个分隔符的
它只适合单个分隔符的情况
我们一般用StreamTokenizer的时候都这样实例化,这样的StreamTokenizer对象速度是最快的
StreamTokenizer st =new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
我们在用StreamTokenizer做算法题的时候主要就用quoteChar和wordChars两个方法
quoteChar:用来设置分隔符
whitespaceChars:用来设置空白分隔符
wordChars:用来设置单词要素
StreamTokenizer默认将/作为注解符,/后面的东西都不会被解析。如果想读取/,就可以直接用
st.wordChars('/', '/');
这个方法将/作为一个普通的单词要素,这样/就可以作为一个普通的字符被读取解析了。
如果我不想用空格作为分隔符了,也可以用这个方法,这样我们就可以读入有空的字符串了
st.wordChars(' ', ' ');
如果我想设置别的字符作为分隔符,可以使用quoteChar方法来设置
如我想让a作为分隔符
st.quoteChar('a');
但是我们最好还是用
st.whitespaceChars('a', 'a');
这个来设置分割符,原因上面已经写了这里
使用StreamTokenizer时要注意它默认设置是有很多字符不是单词要素的,所以会读取解析不了,如有需要需要自己用wordChars方法手动设置。我们可以简单的理解为StreamTokenizer只能读取26个英文字母、汉字、数字(只是简单的理解,他其实还可以读入别的字符,只是那些字符在算法题中几乎用不到)。其他的符号都是不可以读入的,需要我们自己用wordChars()方法设置。
一般我们就自己设置上这两组就够了
33-64 (就是!-@, 可以简单的记为小键盘的1和2 )
91-96
st.wordChars('33', '64');
st.wordChars('91', '96');
StreamTokenizer st =new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
st.nextToken(); // 获取下一组标记 默认是按照空格分割的 回车,tab是结束符
int i=(int) st.nval; //st.navl默认解析出的格式是double
st.nextToken();
double j=st.nval;
st.nextToken();
String s=st.sval;
public class Main {
public static void main(String[] args) throws IOException {
StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
//PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
int a, b;
while(in.nextToken() != StreamTokenizer.TT_EOF) // 表示读到了文件末尾
{
a = (int)in.nval;
in.nextToken();
b = (int)in.nval;
//out.println(a + b);
System.out.println("a + b = "+(a+b));
}
//out.flush();
}
}