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 |
通过这个表格相信大家也能一目了然。希望大家能够学到一些东西,最后送大家一句共勉的话:如果觉得辛苦,那一定是因为在走上坡路,谢谢。