在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、字段摘要


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

Java代码 复制代码 收藏代码
  1. public static void main(String[] args) throws IOException{
  2. //注:用Scanner in=new Scanner(System.in)超时!!!!!!!!
  3. StreamTokenizer st = new StreamTokenizer(new BufferedReader(
  4. new InputStreamReader(System.in)));
  5. PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
  6. // while(st.nextToken() != StreamTokenizer.TT_EOF)
  7. st.nextToken();
  8. int n= (int) st.nval;
  9. st.nextToken();
  10. int p=(int) st.nval;
  11. Main ma=new Main();
  12. int sign;
  13. int ll,rr;
  14. ma.build(1,1,n);
  15. for(int i=0;i<p;i++){
  16. st.nextToken();
  17. sign=(int) st.nval;
  18. if(sign==3){
  19. out.printf("%d\n",ma.getMax());
  20. }else{
  21. st.nextToken();
  22. ll=(int) st.nval;
  23. st.nextToken();
  24. rr=(int) st.nval;
  25. rr=ll+rr-1;
  26. if(sign==2)
  27. sign=0;
  28. ma.update(1,ll,rr,sign);
  29. }
  30. }
  31. out.flush();
  32. }
  33. }
  34. 另一个示例:
  35. import java.io.BufferedReader;
  36. import java.io.IOException;
  37. import java.io.InputStreamReader;
  38. import java.io.StreamTokenizer;
  39. public class Test2 {
  40. public static void main(String[] args) {
  41. int type;
  42. StreamTokenizer tok = new StreamTokenizer(new BufferedReader(
  43. new InputStreamReader(System.in)));
  44. System.out.println("please input :");
  45. try {
  46. while((type=tok.nextToken())!=tok.TT_EOL){
  47. if(type==tok.TT_NUMBER){
  48. System.out.println(tok.nval);
  49. }else if(type==tok.TT_WORD){
  50. if(tok.sval.equalsIgnoreCase("exit"))
  51. {
  52. System.exit(1);
  53. }
  54. System.out.println(tok.sval);
  55. }
  56. }
  57. } catch (IOException e) {
  58. e.printStackTrace();
  59. }
  60. }
  61. }  

你可能感兴趣的:(token,单引号,双引号,的,用)