在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、字段摘要
在POJ中使用StreamTokenizer从命令行获取输入

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


你可能感兴趣的:(java,jdk,编程)