在POJ中使用StreamTokenizer从命令行获取输入

在http://poj.org/上用JAVA解题一般用Scanner类来进行输入,但对时间要求严格的题,用它可能会超时,我解POJ1823的时候就遇到这样的问题,后改用StreamTokenizer类进行输入,就过了。看来后者处理输入的效率要高点。
现小结如下:

1、类java.io.StreamTokenizer可以获取输入流并将其分析为Token(标记)。
StreamTokenizer的nextToken方法读取下一个标记

2、默认情况下,StreamTokenizer认为下列内容是Token:字母、数字、除c和c++注释符号以外的其他符号。
如符号“/”不是Token,注释后的内容也不是,而"/"是Token。单引号和双引号以及其总的内容,只能算一个Token。

3、字段摘要
[img]http://dl.iteye.com/upload/attachment/0077/3736/0a3aa84e-aa5f-384e-ac54-11b07b6010a8.gif[/img]

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的输入(见[url]http://128kj.iteye.com/blog/1739733[/url]


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();
}
}
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值