今天面试碰到这样一个题,想不出来,请教牛人啊
有一个文本文件(大小任意),内容为一篇文章(为简化编程难度,假设你的机器可用内存很小,可能会小于文本的大小,试设计一个高效的算法,读取文本文件,能统计中文文本中出现的单词的出现频率,并按由大到小进行统计输出。完成程序后请对的你的程序进行自我评价,指出程序可以改进的地方还有哪些?程序时候还有其他方式实现)

解决方案 »

  1.   

    1. 中文的字符数小于65535个(至于为什么,参考Unicode),所以创建一个char[65535] chs的数组
    2. 读取文件使用BufferedReader按行读取 (有缓冲和无缓冲的读取对性能影响很大,毕竟电脑的瓶颈在IO)
    3. 从读取到的行里取得每一个字符ch,然后chs[ch] += 1
    4. 对数组排序。
    5. 输出数组chs中非0的字符:即文件里的字符。
      

  2.   

    package test;import java.io.BufferedReader;
    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;
    }
    }
      

  3.   

    某业务部门根据需要提供多个文本如A、B、C 等等,且文件大小不一,每个文件都有多列,其中每个文件中的列都与我系统中的数据库中某表中的列对应(比如A文件中的列与表ta对应,B文件中的列与表tb对应),但是文件中的列于表中的列对应关系式无序的,设计一个通用程序,能统一处理各文件使其数据持久化到数据库对应表中并保证较高的处理效率,写出关键代码(不用完整代码),但是要写出设计思想(尽可能详细)和采用的主要技术方式以及程序处理过程中需要考虑的问题。