java程序员的从0到1:统计某字符串在某文件中出现的次数(面试题)
目录:
1. 编程题目
2. 方法一
3. 方法二
4. 方法三
5. 方法四
6. 总结
正文:
1. 编程题目
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。
2. 方法一
废话少说,先来看看方法一的代码:
public static int getStringNumberMethod1(String fileName, String str) throws Exception {
int num = ; BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName));
String readLine = "";
StringBuffer stringBuffer = new StringBuffer();
while((readLine = bufferedReader.readLine()) != null){
stringBuffer.append(readLine);
}
for(int i = ; i < stringBuffer.length(); i++){
if(stringBuffer.indexOf(str, i) != -){
i = stringBuffer.indexOf(str, i);
num++;
}
}
return num;
}
首先利用输入流将文件中的字符串都存储到一个StringBuffer中,然后再去这个StringBuffer中统计此字符串出现的次数,这里要注意的是每次找到对应的字符串时,在接下来要找的这个字符串会发生变化。
3. 方法二
来看看第二种方法:
public static int getStringNumberMethod2(String fileName, String str) throws Exception {
int num = ; BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName));
String readLine = "";
StringBuffer stringBuffer = new StringBuffer();
while((readLine = bufferedReader.readLine()) != null){
stringBuffer.append(readLine);
}
int start = ;
while( (start = stringBuffer.indexOf(str, start)) != -){
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 -; return num;
}
第三种方法在查找对应字符串时,是先将StringBuffer转换成了String,然后利用split,将要查找的字符串当做是一种条件进行分割,得出的数值减一便是要查找字符串的数量。这种方法是不是很巧妙,但是它的性能如何呢,一会我们揭晓答案。
5. 方法四
第四种方法:
public static int getStringNumberMethod4(String file, String find) throws Exception
{
int count = ;
Reader in = new FileReader(file);
int c;
while ((c = in.read()) != -) {
while (c == find.charAt()) {
for (int i = ; i < find.length(); i++) {
c = in.read();
if (c != find.charAt(i)){
break;
}
if (i == (find.length() - )) {
count++;
}
}
}
}
return count;
}
第四种方法是一边从文件中利用流读取数据,一边做判断,这种也可以实现这个功能,但是可想而知效率肯定不是最高的。
6. 总结
看完了以上四种方法,不知道大家看过瘾没,但是这四种方法既然都能达到这个目的,谁的效率又是最高呢?我特意做了一个测试,在一个文件中有50多万个字符,然后利用这四种方法从这个文件中查找对应的字符串,结果如下:
第一次测试结果(ms) | 第二次测试结果(ms) | 第三次测试结果(ms) | |
方法一 | 19 | 25 | 20 |
方法二 | 63 | 70 | 66 |
方法三 | 25 | 22 | 22 |
方法四 | 62 | 56 | 62 |
通过这个表格相信大家也能一目了然。希望大家能够学到一些东西,最后送大家一句共勉的话:如果觉得辛苦,那一定是因为在走上坡路,谢谢。
java程序员的从0到1:统计某字符串在某文件中出现的次数(面试题)的更多相关文章
- 作为一名双非本科毕业的Java程序员,我该如何在日益严重的内卷化中避免被裁?
前言 对一个 Java 程序员而言,并发编程能否熟练掌握是判断他是不是优秀的重要标准之一.因为并发编程在 Java 语言中最为晦涩的知识点,它涉及内存.CPU.操作系统.编程语言等多方面的基础能力,更 ...
- java程序员的从0到1:@Resource与@Autowired的比较
目录: 1.@Resource与@Autowired的源码分析 2.@Resource与@Autowired的相同点 3.@Resource与@Autowired的不同点 正文: 1.@Resourc ...
- Java程序员面试题集(51-70)(转)
转:http://blog.csdn.net/jackfrued/article/details/17403101 Java程序员面试题集(51-70) 摘要:这一部分主要讲解了异常.多线程.容器和I ...
- Java程序员面试题集2
51.类ExampleA 继承Exception,类ExampleB 继承ExampleA. 有如下代码片断: try{ throw new ExampleB("b") }catc ...
- 2019年高级Java程序员面试题汇总
目录 JDK Dubbo Zookeeper Strut2 Spring系列 Redis系列 Mysql系列 Java多线程 消息中间件 线程池 事物 JVM 设计模式 其他 程序设计 基础知识 编程 ...
- JAVA程序员必看的15本书-JAVA自学书籍推荐
作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水 ...
- 2017年 Java 程序员,风光背后的危机
不得不承认,经历过行业的飞速发展期,互联网的整体发展趋于平稳.为什么这么说?为什么要放在 Java 程序员的盘点下说? 的确,对于进可攻前端,后可守后端大本营的 Java 程序员而言,虽然供应逐年上涨 ...
- Java程序员必须掌握的常用Linux命令。
Java程序员也是半个运维了,在日常开发中经常会接触到Linux环境操作.小公司的开发人员甚至是兼了全运维的工作,下面整理了一些常用的Linux操作命令. Linux常用指令 ls 显示文件或目录 - ...
- Java程序员如何在竞争中保持优势
Java程序员入门容易,进阶很难,想要在竞争中保持优势,脚踏实地的同时也要仰望星空规划自己的未来.时间在流逝,年龄在增加,你期望的薪水也在不断增多,你总得让自己能力持续增加以配得上想要的收入吧. 从初 ...
随机推荐
- resin3.X那些事之resin.conf
[经验总结]resin那些事之resin.conf ----by johnson 话说与resin打交道很久了,却从未系统了解过.resin一听火了,说:你老兄当真与我打交道很久了?工具.流程如此发达 ...
- 【poj1679】The Unique MST
[题目大意] 共T组数据,对于每组数据,给你一个n个点,m条边的图,设图的最小生成树为MST,次小生成树为ans,若MST=ans,输出Not Unique!,否则输出MST [题解] 很明确,先求M ...
- 微信小程序怎么获取用户输入
能够获取用户输入的组件,需要使用组件的属性bindchange将用户的输入内容同步到 AppService. <input id="myInput" bindchange=& ...
- 面试题: java多线程 背1
如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...
- GCC 常见参数配置
博客转载自:https://www.cnblogs.com/zhangsir6/articles/2956798.html 简介gcc and g++现在是gnu中最主要和最流行的c & c+ ...
- python3--装饰器高级学习版
__author__ = "Aaron Fan"import time #导入time模块user,passwd = 'alex','abc123' #用户名密码def auth( ...
- React项目中的registerServiceWorker的作用
在公司的React前端项目中,发现有一个registerServiceWorker.js文件, 很久都没弄明白这个文件是干什么用的,查询了一些资料后,了解了一些 service worker是在后台运 ...
- eWebEditor9.x整合教程-Xproer.WordPaster
版权所有 2009-2017 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/wordpa ...
- Redesign Your App for iOS 7 之 页面布局【转】
前言 iOS7是目前iOS史上最颠覆的一次改版. 它的出现令人兴奋,因为它将会带我们进入一个全新的时代: 它的到来也让我们忧心,因为它颠覆了一切,包括我们过去做过的很多努力. 但是,相信大家乐意为这个 ...
- ThinkPHP3.2.3完整版中对Auth.class.php的使用
一,先创建数据表 1.think_auth_rule,规则表 id:主键, name:规则唯一标识, title:规则中文名称 status 状态:为1正常,为0禁用, condition:规则表达式 ...