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程序员入门容易,进阶很难,想要在竞争中保持优势,脚踏实地的同时也要仰望星空规划自己的未来.时间在流逝,年龄在增加,你期望的薪水也在不断增多,你总得让自己能力持续增加以配得上想要的收入吧. 从初 ...
随机推荐
- c之指针退化和printf小陷阱
今天参加了个笔试和面试,面试官给我指出了我试卷上的错误,我才发现,我的知识疏漏之处原来有不少,很是感谢. 记得曾经有本书,专门写c的陷阱来着,里面有很多都牵扯到指针.嘿嘿,这小家伙古灵精怪,总是喜欢误 ...
- laravel 队列
php artisan queue:table 先创建job 队列表 php artisan migrate 执行表 php artisan make:job SendMessage 创建一个job ...
- 由于挂载的nfs存储目录掉下线,导致创建VM时,无法创建
具体错误,如下截图 重新挂载存储后,在创建VM,将成功
- Linux查看内存,负载状态
Linux查看内存,负载状态 查看内存使用情况 www.ahlinux.com cat /proc/meminfo MemTotal: 16332644 kB MemFree: ...
- adb shell unauthorized问题
出现unauthorized 一般插上usb后,手机会弹出一个要求你授权debugging的对话框,如果没有的话,就是rsa_key有问题: /adb_keys. User-installed key ...
- CompositePattern(23种设计模式之一)
设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计模式六大 ...
- CSS3 grayscale滤镜图片变黑白
1. 使整个页面的图片都变成灰色的,代码如下. html{ font-size: 100%; -webkit-text-size-adjust: none; -ms-text-s ...
- yum 安装telnet
检测是否安装 rpm -qa |grep telnet 安装 yum install xinetd yum install telnet-server yum -y install telnet 再次 ...
- (转)什么?你还不会写JQuery 插件
原文地址:http://www.cnblogs.com/joey0210/p/3408349.html 前言 如今做web开发,jquery 几乎是必不可少的,就连vs神器在2010版本开始将Jque ...
- JAVA WEB第0课
在这学期内要掌握JAVA WAB高级网站开发的所有知识,并可以实际运用到.每周将花费20小时左右的时间来学习此门课程,每一天,在当天其他课程任务完成后将开始学习该课程,具体时间要看当天 ...