在http://poj.org/上用JAVA解题一般用Scanner类来进行输入,但对时间要求严格的题,用它可能会超时,我解POJ1823的时候就遇到这样的问题,后改用StreamTokenizer类进行输入,就过了。看来后者处理输入的效率要高点。
现小结如下:
1、类java.io.StreamTokenizer可以获取输入流并将其分析为Token(标记)。
StreamTokenizer的nextToken方法读取下一个标记
2、默认情况下,StreamTokenizer认为下列内容是Token:字母、数字、除c和c++注释符号以外的其他符号。
如符号“/”不是Token,注释后的内容也不是,而"/"是Token。单引号和双引号以及其总的内容,只能算一个Token。
3、字段摘要
4、 构造方法:
public StreamTokenizer(Reader r)
为了提高效率,使用BufferedReader,如下,创建StreamTokenizer对象
StreamTokenizer st =new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
5、为了从流中获取标记,可以调用StreamTokenizer的nextToken()方法。
调用nextToken()方法以后,如果标记是字符串,可用 String s=st.sval,如果是整数用 int n=(int) st.nval得到。
例:poj1823的输入(见
http://128kj.iteye.com/blog/1739733
public static void main(String[] args) throws IOException{
//注:用Scanner in=new Scanner(System.in)超时!!!!!!!!
StreamTokenizer st = new StreamTokenizer(new BufferedReader(
new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
// while(st.nextToken() != StreamTokenizer.TT_EOF)
st.nextToken();
int n= (int) st.nval;
st.nextToken();
int p=(int) st.nval;
Main ma=new Main();
int sign;
int ll,rr;
ma.build(1,1,n);
for(int i=0;i<p;i++){
st.nextToken();
sign=(int) st.nval;
if(sign==3){
out.printf("%d\n",ma.getMax());
}else{
st.nextToken();
ll=(int) st.nval;
st.nextToken();
rr=(int) st.nval;
rr=ll+rr-1;
if(sign==2)
sign=0;
ma.update(1,ll,rr,sign);
}
}
out.flush();
}
}
另一个示例:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class Test2 {
public static void main(String[] args) {
int type;
StreamTokenizer tok = new StreamTokenizer(new BufferedReader(
new InputStreamReader(System.in)));
System.out.println("please input :");
try {
while((type=tok.nextToken())!=tok.TT_EOL){
if(type==tok.TT_NUMBER){
System.out.println(tok.nval);
}else if(type==tok.TT_WORD){
if(tok.sval.equalsIgnoreCase("exit"))
{
System.exit(1);
}
System.out.println(tok.sval);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}