注意:用JAVA解題一般用Scanner類來進行輸入,但對時間要求嚴格的題,用它可能會超時,我、解POJ1823的時候就遇到這樣的問題,后改用StreamTokenizer類進行輸入,就過了。看來后者處理輸入的效率要高點。現小結如下:1、類java.io.StreamTokenizer可以獲取輸入流并將其分析為Token(標記)。StreamTokenizer的nextToken方法讀取下一個標記2、默認情況下,StreamTokenizer認為下列內容是Token:字母、數字、除c和c++注釋符號以外的其他符號。 如符號“/”不是Token,注釋后的內容也不是,而"/"是Token。單引號和雙引號以及其總的內容,只能算一個Token。
3、為了提高效率,使用BufferedReader,如下,創建StreamTokenizer對象
StreamTokenizer st =new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
4、為了從流中獲取標記,可以調用StreamTokenizer的nextToken()方法。調用nextToken()方法以后,如果標記是字符串,可用 String s=st.sval,如果是整數用 int n=(int) st.nval得到。
st.nextToken(); int i=(int) st.nval; //st.navl默認解析出的格式是doublest.nextToken(); int j=(int) st.nval; st.nextToken(); String s=st.sval;
附錄:
轉載他人
關鍵點:
//直接在程序中指定了文件輸入路徑:String fileName = "d:/ceshi.txt";package szu.edu;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.io.StreamTokenizer;/** * 使用StreamTokenizer來統計文件中的字符數 * StreamTokenizer 類獲取輸入流并將其分析為“標記”,允許一次讀取一個標記。 * 分析過程由一個表和許多可以設置為各種狀態的標志控制。 * 該流的標記生成器可以識別標識符、數字、引用的字符串和各種注釋樣式。 * * 默認情況下,StreamTokenizer認為下列內容是Token: 字母、數字、除C和C++注釋符號以外的其他符號。 * 如符號"/"不是Token,注釋后的內容也不是,而"/"是Token。單引號和雙引號以及其中的內容,只能算是一個Token。 * 統計文章字符數的程序,不是簡單的統計Token數就萬事大吉,因為字符數不等于Token。按照Token的規定, * 引號中的內容就算是10頁也算一個Token。如果希望引號和引號中的內容都算作Token,應該調用下面的代碼: * st.ordinaryChar('/''); //將單引號設為普通字符 * st.ordinaryChar('/"'); //將雙引號設為普通字符 */public class StatisFileChars { /** * 統計字符數 * @param fileName 文件名 * @return 字符數 */ public static long statis(String fileName) { FileReader fileReader = null; try { fileReader = new FileReader(fileName); //創建分析給定字符流的標記生成器 StreamTokenizer st = new StreamTokenizer(new BufferedReader( fileReader)); //ordinaryChar方法指定字符參數在此標記生成器中是“普通”字符。 //下面指定單引號、雙引號和注釋符號是普通字符 st.ordinaryChar('/''); st.ordinaryChar('/"'); st.ordinaryChar('/'); String s; int numberSum = 0; int WordSum = 0; int symbolSum = 0; int total = 0; //nextToken方法讀取下一個Token. //TT_EOF指示已讀到流末尾的常量。 while (st.nextToken() != StreamTokenizer.TT_EOF) { //在調用 nextToken 方法之后,ttype字段將包含剛讀取的標記的類型 switch (st.ttype) { //TT_EOL指示已讀到行末尾的常量。 case StreamTokenizer.TT_EOL: break; //TT_NUMBER指示已讀到一個數字標記的常量 case StreamTokenizer.TT_NUMBER: //如果當前標記是一個數字,nval字段將包含該數字的值 s = String.valueOf((st.nval)); System.out.PRintln(s); numberSum += s.length(); break; //TT_WORD指示已讀到一個文字標記的常量 case StreamTokenizer.TT_WORD: //如果當前標記是一個文字標記,sval字段包含一個給出該文字標記的字符的字符串 s = st.sval; wordSum += s.length(); break; default: //如果以上3中類型都不是,則為英文的標點符號 s = String.valueOf((char) st.ttype); symbolSum += s.length(); } } System.out.println("sum of number = " + numberSum); System.out.println("sum of word = " + wordSum); System.out.println("sum of symbol = " + symbolSum); total = symbolSum + numberSum + wordSum; System.out.println("Total = " + total); return total; } catch (Exception e) { e.printStackTrace(); return -1; } finally { if (fileReader != null) { try { fileReader.close(); } catch (IOException e1) { } } } } public static void main(String[] args) { String fileName = "d:/ceshi.txt"; StatisFileChars.statis(fileName); }}注意:除了以上的用法,還有一個很常見的用法。用于基本的輸入操作!(比如:常用語acm編程中,輸入效率比較高。)
BufferedReaderprovides quite fast read Operations for almost all problems. But this class may be used to read single characters and lines only. To read tokens and numbers you should useStringTokenizerorStreamTokenizer.
import java.io.*;public class Main{ public static void main(String[] args) throws IOException { StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); //PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); int a, b; while(in.nextToken() != StreamTokenizer.TT_EOF) { a = (int)in.nval; in.nextToken(); b = (int)in.nval; //out.println(a + b); System.out.println("a + b = "+(a+b)); } //out.flush(); }}新聞熱點
疑難解答