`
128kj
  • 浏览: 594768 次
  • 来自: ...
社区版块
存档分类
最新评论

在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

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


  • 大小: 7.9 KB
0
0
分享到:
评论

相关推荐

    Poj中的一些题目源代码

    在编程竞赛中,POJ(Problemset Online Judge)是一个知名的在线判题系统,用于检验和提交程序解决问题的能力,而OI(OnlineJudge)是这类系统的统称。下面将对每个文件名中的题目和相关算法进行详细解释。 1. **P...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **解释**:排列组合问题通常涉及从n个不同元素中选取k个元素的所有可能的方式。 #### 3. 概率统计 - **例题**:poj3273, poj3258, poj1905, poj3122 - **解释**:概率统计问题通常涉及计算某个事件发生的概率。 ...

    我在poj的代码

    标题中的“我在poj的代码”指的是作者在POJ平台上完成的编程题目的源代码集合。 【描述】:“我在poj共做了175题,暂时传上来看看” 这句描述透露了作者在POJ平台上参与的编程练习数量,总计完成了175道题目。这...

    POJ1159-Palindrome

    1. **字符串处理**:在C++中,处理字符串通常使用`std::string`类,可以进行字符串的创建、拼接、查找、比较等操作。在本题中,我们需要读取输入的字符串并进行分析。 2. **回文判断**:回文判断有多种方法。一种...

    POJ.rar_poj java_poj1048

    【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...

    POJ2002-Squares

    在解题报告中,作者可能会首先分析问题的输入和输出格式,然后讨论可能的解决方案。可能的策略包括预计算某些值、使用数据结构优化查找,或者利用特定的数学性质来减少计算量。在AC代码中,会看到这些策略是如何转化...

    POJ_3131.zip_POJ 八数码_poj

    标题中的“POJ_3131.zip_POJ 八数码_poj”指的是一个与编程竞赛网站POJ(Problem Set Algorithm)相关的项目,具体是针对3131号问题的解决方案,该问题涉及到了八数码游戏。八数码游戏,又称滑动拼图,是一个经典的...

    POJ3273-Monthly Expense

    【标题】"POJ3273-Monthly Expense"是一个编程题目,源自北京大学的在线判题系统POJ(Problem Set of Peking University)。...此外,记得使用POJ提供的测试数据进行调试,并提交代码以获取自动评测结果。

    poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告

    poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...

    POJ2676-Sudoku

    在提供的文件“POJ2676-Sudoku.cpp”中,应该包含了上述算法的C++实现,而“POJ2676-Sudoku.doc”可能包含了解题思路、代码解释或者测试数据的分析。详细阅读这两个文件,可以帮助我们更深入地理解这个问题的解决...

    POJ第1861题源码POJ第1861题源码POJ第1861题源码POJ第1861题源码

    对于POJ第1861题,参赛者可能需要读取输入数据,构建一个加权图,然后应用Prim或Kruskal算法找出最小生成树,最后输出树中边的权重总和或者某种特定格式的树结构。解题过程可能涉及到错误处理、边界条件检查以及效率...

    POJ2305-Basic remains

    总的来说,"POJ2305-Basic remains"是一个适合初学者练习基本编程技能和数学逻辑的题目,同时也能帮助他们掌握如何在实际编程环境中解决问题。通过解决此类问题,程序员可以提升自己的编程思维和调试能力。

    poj1094 拓扑排序

    **拓扑排序**的基本思想是:对于有向无环图G,如果存在一条从顶点u到顶点v的路径,那么在拓扑排序结果中,u一定出现在v之前。拓扑排序可以得到多个不同的合法序列,但每个顶点只会出现一次。一个典型的拓扑排序算法...

    POJ1010-STAMPS

    【标签】"POJ 1010 STAMPS"是问题的标识符,POJ系统中的每个题目都有一个唯一的编号,1010是这个问题在系统中的ID,"STAMPS"可能是题目涉及的主题或关键词,可能与邮票、收集或组合优化有关。 【压缩包子文件的文件...

    POJ3122-Pie

    在这个文件中,程序员可能使用了标准库中的数据结构和算法,如数组、指针、循环、条件语句等,来解决问题。 2. "POJ3122-Pie.doc":这可能是解题报告的文档,通常使用Microsoft Word或其他文档编辑软件创建。报告中...

    POJ1017-Packets

    2. **输入/输出处理**:在C++中,通常使用cin/cout或scanf/printf进行输入输出,需要理解如何正确读取和处理题目给出的输入格式。 3. **字符串操作**:题目可能涉及到字符串的处理,如分割、比较、查找子串等。 4....

    poj.rar_poj

    在这个压缩包中,很可能包含了用户在POJ上参与编程挑战时编写的源代码。 描述提到“我的一些pojac代码”,这表明文件包含的是用户个人编写的一些代码片段,可能是为了解决POJ上的特定问题。虽然用户提到代码不多,...

    POJ 1027 官方测试数据

    【描述】"POJ1027的官方测试数据"意味着这道题目涉及的具体内容需要通过查看题目详情来获取。通常,这些测试数据包括了多个输入案例,每个案例都有预期的输出结果,用来验证参赛者的程序是否能在各种情况下得到正确...

    POJ3252-Round Numbers

    2. **比较运算**:找出数组中最接近整数的值,可能需要使用到比较运算符。 3. **绝对值计算**:计算数值与整数的差距,可能需要用到绝对值函数。 4. **循环和条件语句**:遍历数组并检查每个元素是否为“圆整数”。 ...

Global site tag (gtag.js) - Google Analytics