在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. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章