国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

java StreamTokenizer使用

2019-11-14 23:58:49
字體:
來源:轉載
供稿:網友
java StreamTokenizer使用

注意:用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;

附錄:

轉載他人

關鍵點:

    • 類java.io.StreamTokenizer可以獲取輸入流并將其分析為Token(標記)。StreamTokenizer的nextToken方法將讀取下一個標記
    • 默認情況下,StreamTokenizer認為下列內容是Token:字母、數字、除C和C++注釋符號以外的其他符號。如符號“/”不是Token,注釋后的內容也不是,而“/”是Token。單引號和雙引號以及其中的內容,只能算是一個Token。
    • 要統計文件的字符數,不能簡單地統計Token數,因為字符數不等于Token,按照Token的規定,引號中的內容就算是10頁也算是一個Token。如果希望引號和引號中的內容都算作Token,應該通過StreamTokenizer的ordinaryCha()方法將單引號和雙引號當做普通字符處理。
//直接在程序中指定了文件輸入路徑: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();    }}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宜川县| 景德镇市| 敦煌市| 阳江市| 河东区| 图木舒克市| 宁国市| 罗源县| 多伦县| 绥化市| 安化县| 隆德县| 岐山县| 富平县| 略阳县| 乌拉特前旗| 靖远县| 额敏县| 高密市| 乐安县| 凤城市| 贵德县| 石门县| 广河县| 隆昌县| 镇平县| 玉门市| 兴海县| 黄骅市| 曲沃县| 天峨县| 秭归县| 灵川县| 台南市| 延川县| 赣州市| 呼伦贝尔市| 迁安市| 买车| 改则县| 长宁区|