字典树 找出单词文件中出现次数前十的单词

Posted lick468

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字典树 找出单词文件中出现次数前十的单词相关的知识,希望对你有一定的参考价值。

import java.io.*;
import java.util.*;

/**
 * 不区分大小写
 */
class TrieNode
    TrieNode[] next = new TrieNode[26]; // 只有小写字母的字典树    0存放a   1存放b ...   25存放z
    int count = 0;//字母出现的次数
    int wordCount = 0;// 单词出现的次数
    char currentChar;
    public TrieNode(char word) 
        this.currentChar = word;
    


public class Main 

    public static void main(String[] args) throws IOException
        //读取文件(字符流)
        BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\word.txt"),"GBK"));// 这里主要是涉及中文
        //读取数据
        //循环取出数据
        String str = null;
        TrieNode root = new TrieNode(‘0‘); // 初始化根节点
        while ((str = in.readLine()) != null) 
            insert(root,str);
        


        // 查找单词出现的次数
       // int count = query(root, "world");
       // System.out.println(count);
        // 查找单词出现的次数最多的10个
        Map<String,Integer> map = new TreeMap<String, Integer>();// 默认按照key 升序排序
        in = new BufferedReader(new InputStreamReader(new FileInputStream("E:\\word.txt"),"GBK"));
        while ((str = in.readLine()) != null) 
            int query = query(root, str);
            map.put(str,query);
        
        // 按值排序  降序排序
        List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() 
            @Override
            public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) 
                return -o1.getValue().compareTo(o2.getValue());
            
        );
        int i=0;
        for (Map.Entry<String, Integer> mapping : list) 
            if(i++ == 10) 
                break;
            
            System.out.println("单词:" + mapping.getKey() + " 出现:" + mapping.getValue());
        

        //关闭流
        in.close();


    

    public static  void insert(TrieNode root,String str) 
        str = str.toLowerCase();
        char[] chars = str.toCharArray();
        for(int i=0;i<chars.length;i++) 
            int index = chars[i]-‘a‘;
            TrieNode[] next = root.next;
            if(next[index] == null) // 节点为空
               // System.out.print("插入"+ chars[i] +";");
                next[index] = new TrieNode(chars[i]);
            
            next[index].count++;
            root = next[index];
        
        root.wordCount++;
       // System.out.println();
    

    //查询字符串是否存在,不存在返回0 ,存在返回个数
    public static int query(TrieNode root,String str) 
        if(root == null) 
            return 0;
        
        str = str.toLowerCase();
        char[] chars = str.toCharArray();
        for(int i=0;i<chars.length;i++) 
            TrieNode[] next = root.next;
            int index = chars[i]-‘a‘;
            if(next[index] == null) 
                return 0;
            else 
                root = next[index];
            
        
        return root.wordCount;
    



  

以上是关于字典树 找出单词文件中出现次数前十的单词的主要内容,如果未能解决你的问题,请参考以下文章

逆序单词 HIhoCoder 1366 字典树

Trie树(字典树)

LintCode 单词搜索Ⅱ 字典树

字典树Trie树

HDU 1298 T9 ( 字典树 )

51nod 1095 Anigram单词hash/map/排序/字典树