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 |
通过这个表格相信大家也能一目了然。希望大家能够学到一些东西,最后送大家一句共勉的话:如果觉得辛苦,那一定是因为在走上坡路,谢谢。
最新文章
- Linux 多线程互斥量互斥
- Divide and Conquer:River Hopscotch(POJ 3258)
- 对hashmap与hashcode()、equals()的理解
- mvn 配置修改
- POI教程之第一讲:创建新工作簿, Sheet 页,创建单元格
- 中文版Windows 7下设置日语格式布局的键盘
- iOS 使用XCode6打开项目以后再用XCode5出现的问题fatal error: malformed or corrupted AST file: &#39;Unable to load module
- linux常用命令:5网络命令
- Android实例] android获取web服务器端session并验证登陆
- C#的默认编码
- github使用成长记
- 检测 IE 版本 in Javascript
- 【UVA 1411】 Ants (KM)
- textarea禁止拖拽
- 浅谈cookie,sessionStorage和localStorage
- jenkins的sbt插件安装
- Class.forName()+Class.forName().newlnstance()和new语句和初始化块+static初始化块+构造方法之间的关系
- A1030. Travel Plan
- git操作手册
- cocos2dx粒子系统的简单使用
热门文章
- os.chdir(";/deepmatching";) OSError: [Errno 2] No such file or directory: &#39;/deepmatching&#39;
- Qt入门-第一个Qt程序
- 697. Degree of an Array 频率最高元素的最小覆盖子数组
- Linux文件系统操作命令
- Entity Framework 6.0 Tutorials(1):Introduction
- C/C++预处理指令常见的预处理指令
- css总结2:Flex 布局教程:Flex 语法(转)
- poj3080 Blue Jeans(暴枚+kmp)
- Asp.net MVC 基于Area的路由映射
- javascript 视频播放指定的时间段