java程序员的从0到1:统计某字符串在某文件中出现的次数(面试题)

目录:

1. 编程题目

2. 方法一

3. 方法二

4. 方法三

5. 方法四

6. 总结

正文:

1. 编程题目

  写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。

2. 方法一

  废话少说,先来看看方法一的代码:

publicstaticint getStringNumberMethod1(String fileName, String str) throws Exception {

        intnum =0;

        BufferedReader bufferedReader =newBufferedReader(new FileReader(fileName));

        String readLine ="";

        StringBuffer stringBuffer =new StringBuffer();

        while((readLine = bufferedReader.readLine()) !=null){

            stringBuffer.append(readLine);

        }

        for(inti =0; i < stringBuffer.length(); i++){

            if(stringBuffer.indexOf(str, i) != -1){

                i = stringBuffer.indexOf(str, i);

                num++;

            }

        }

        return num;

    }

  首先利用输入流将文件中的字符串都存储到一个StringBuffer中,然后再去这个StringBuffer中统计此字符串出现的次数,这里要注意的是每次找到对应的字符串时,在接下来要找的这个字符串会发生变化。

3. 方法二

  来看看第二种方法:

publicstaticint getStringNumberMethod2(String fileName, String str) throws Exception {

        intnum =0;

        BufferedReader bufferedReader =newBufferedReader(new FileReader(fileName));

        String readLine ="";

        StringBuffer stringBuffer =new StringBuffer();

        while((readLine = bufferedReader.readLine()) !=null){

            stringBuffer.append(readLine);

        }

        intstart =0;

        while( (start = stringBuffer.indexOf(str, start)) != -1){

            stringBuffer = stringBuffer.delete(start, start + str.length());

            num ++;

        }

        return num;

    }

  第二种方法应该比第一种方法更好理解,就是在找到对应的字符串时,下一次查找的字符串变成了原来的字符串删掉出现字符串位置之前的字符,第二种方法用到了StringBuffer的delete方法,因此在性能上会比第一种方法差一点。

4. 方法三

  第三种方法:

publicstaticint getStringNumberMethod3(String fileName, String str) throws Exception {

        int num ;

        StringBuffer stringBuffer =new StringBuffer();

        BufferedReader bufferedReader =newBufferedReader(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. 方法四

  第四种方法:

publicstaticint getStringNumberMethod4(String file, String find) throws Exception

    {

        intcount =0;

        Reader in=new FileReader(file);

        int c;

        while((c =in.read()) != -1) {

            while(c == find.charAt(0)) {

                for(inti =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)

方法一192520

方法二637066

方法三252222

方法四625662


通过这个表格相信大家也能一目了然。希望大家能够学到一些东西,最后送大家一句共勉的话:如果觉得辛苦,那一定是因为在走上坡路,谢谢。                                                                                                                    欢迎工作一到五年的Java工程师朋友们加入Java群: 891219277

群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容