今天面试碰到这样一个题,想不出来,请教牛人啊
有一个文本文件(大小任意),内容为一篇文章(为简化编程难度,假设你的机器可用内存很小,可能会小于文本的大小,试设计一个高效的算法,读取文本文件,能统计中文文本中出现的单词的出现频率,并按由大到小进行统计输出。完成程序后请对的你的程序进行自我评价,指出程序可以改进的地方还有哪些?程序时候还有其他方式实现)
有一个文本文件(大小任意),内容为一篇文章(为简化编程难度,假设你的机器可用内存很小,可能会小于文本的大小,试设计一个高效的算法,读取文本文件,能统计中文文本中出现的单词的出现频率,并按由大到小进行统计输出。完成程序后请对的你的程序进行自我评价,指出程序可以改进的地方还有哪些?程序时候还有其他方式实现)
2. 读取文件使用BufferedReader按行读取 (有缓冲和无缓冲的读取对性能影响很大,毕竟电脑的瓶颈在IO)
3. 从读取到的行里取得每一个字符ch,然后chs[ch] += 1
4. 对数组排序。
5. 输出数组chs中非0的字符:即文件里的字符。
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;public class test1 { public static void main(String[] args) throws IOException {
List<Map.Entry<Character, Integer>> mapList = null;
File file = new File("d:\\a.txt");
FileReader fr = new FileReader(file);
BufferedReader read = null;
StringBuffer sbf = new StringBuffer();
try {
read = new BufferedReader(fr);
String tempString = null;
try {
while ((tempString = read.readLine()) != null) {
sbf.append(tempString);
}
System.out.println(sbf.toString());
mapList = tongji.tj(sbf);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}finally{
read.close();
fr.close();
}
// 输出统计结果
for (Entry<Character, Integer> mapping : mapList) {
System.out.println(mapping.getKey() + ":" + mapping.getValue());
}
}
}class tongji {
//统计
public static List<Map.Entry<Character, Integer>> tj(StringBuffer sb) {
Map<Character, Integer> map = new HashMap<Character, Integer>();
for (int i = 0, l = sb.length(); i < l; i++) {
char c = sb.charAt(i);
Integer v = map.get(c);
if (null == v) {
map.put(c, 1);
} else {
map.put(c, v + 1);
}
} List<Map.Entry<Character, Integer>> mapList = new ArrayList<Map.Entry<Character, Integer>>(
map.entrySet()); Collections.sort(mapList,
new Comparator<Map.Entry<Character, Integer>>() {
public int compare(Map.Entry<Character, Integer> mapping1,
Map.Entry<Character, Integer> mapping2) {
return mapping1.getValue().compareTo(
mapping2.getValue());
}
});
return mapList;
}
}