java程序員的從0到1:統計某字符串在某文件中出現的次數(面試題)


目錄:

1. 編程題目

2. 方法一

3. 方法二

4. 方法三

5. 方法四

6. 總結

正文:

1. 編程題目

  寫一個方法,輸入一個文件名和一個字符串,統計這個字符串在這個文件中出現的次數。

2. 方法一

  廢話少說,先來看看方法一的代碼:

public  static int getStringNumberMethod1(String fileName, String str) throws Exception {
        int num = 0;

        BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName));
        String readLine = "";
        StringBuffer stringBuffer = new StringBuffer();
        while((readLine = bufferedReader.readLine()) != null){
            stringBuffer.append(readLine);
        }
        for(int i = 0; i < stringBuffer.length(); i++){
            if(stringBuffer.indexOf(str, i) != -1){
                i = stringBuffer.indexOf(str, i);
                num++;
            }
        }
        return num;
    }

  首先利用輸入流將文件中的字符串都存儲到一個StringBuffer中,然后再去這個StringBuffer中統計此字符串出現的次數,這里要注意的是每次找到對應的字符串時,在接下來要找的這個字符串會發生變化。

3. 方法二

  來看看第二種方法:

public static int getStringNumberMethod2(String fileName, String str) throws Exception {
        int num = 0;

        BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName));
        String readLine = "";
        StringBuffer stringBuffer = new StringBuffer();
        while((readLine = bufferedReader.readLine()) != null){
            stringBuffer.append(readLine);
        }
        int start = 0;
        while( (start = stringBuffer.indexOf(str, start)) != -1){
            stringBuffer = stringBuffer.delete(start, start + str.length());
            num ++;
        }

        return num;
    }

  第二種方法應該比第一種方法更好理解,就是在找到對應的字符串時,下一次查找的字符串變成了原來的字符串刪掉出現字符串位置之前的字符,第二種方法用到了StringBuffer的delete方法,因此在性能上會比第一種方法差一點。

4. 方法三

  第三種方法:

public static int getStringNumberMethod3(String fileName, String str) throws Exception {
        int num ;

        StringBuffer stringBuffer = new StringBuffer();
        BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName));
        String readLine = "";
        while((readLine = bufferedReader.readLine()) != null){
            stringBuffer.append(readLine);
        }

        num = stringBuffer.toString().split(str).length -1;

        return num;
    }

  第三種方法在查找對應字符串時,是先將StringBuffer轉換成了String,然后利用split,將要查找的字符串當做是一種條件進行分割,得出的數值減一便是要查找字符串的數量。這種方法是不是很巧妙,但是它的性能如何呢,一會我們揭曉答案。

5. 方法四

  第四種方法:

public static int getStringNumberMethod4(String file, String find) throws Exception
    {
        int count = 0;
        Reader in = new FileReader(file);
        int c;
        while ((c = in.read()) != -1) {
            while (c == find.charAt(0)) {
                for (int i = 1; i < find.length(); i++) {
                    c = in.read();
                    if (c != find.charAt(i)){
                        break;
                    }
                    if (i == (find.length() - 1)) {
                        count++;
                    }
                }
            }
        }
        return count;
    }

  第四種方法是一邊從文件中利用流讀取數據,一邊做判斷,這種也可以實現這個功能,但是可想而知效率肯定不是最高的。

6. 總結

  看完了以上四種方法,不知道大家看過癮沒,但是這四種方法既然都能達到這個目的,誰的效率又是最高呢?我特意做了一個測試,在一個文件中有50多萬個字符,然后利用這四種方法從這個文件中查找對應的字符串,結果如下:

  第一次測試結果(ms) 第二次測試結果(ms) 第三次測試結果(ms)
方法一 19 25 20
方法二 63 70 66
方法三 25 22 22
方法四 62 56 62

 

  通過這個表格相信大家也能一目了然。希望大家能夠學到一些東西,最后送大家一句共勉的話:如果覺得辛苦,那一定是因為在走上坡路,謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM