java字典树(Trie)实现中文模糊匹配

原理解释:
java实现:https://blog.csdn.net/yuhk231/article/details/51539840
c实现:https://blog.csdn.net/qq_31175231/article/details/77827324
代码模板:缺点,只能检索出在一个分支中的前缀匹配内容

package com.xq.algorithm;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
 
/*
 * 无数据结构设计下的蛮力中文键树
 */
class TrieNode {
    public String value;
    public ArrayList<TrieNode> ptr = null;
    public TrieNode(String value) {
        this.value=value;
        ptr =new ArrayList<TrieNode>();
    }
}
 
public class TrieTree_1 {
    private static TrieNode root = null;
    ArrayList<String> searchResult=new ArrayList<String>();
    StringBuffer tempWord=new StringBuffer();
    int start=0;
    
    public TrieTree_1() {
        root = new TrieNode(null);
    }
    
    public void insert(String key) {
        TrieNode p = root;
        String tempWord;
        boolean contains;
        TrieNode tempNode;
        for (int i = 0; i < key.length(); i++) {
            tempWord=String.valueOf(key.charAt(i));
            contains=false;
            for(TrieNode tn:p.ptr){
                if(tn.value.equals(tempWord)){
                    p=tn;
                    contains=true;
                    break;
                }
            }
            if(!contains){
                tempNode=new TrieNode(tempWord);
                p.ptr.add(tempNode);
                p=tempNode;
            }
        }
    }
    
    public ArrayList<String> search(String key) {  //模糊查询就是这个方法,打个比方比如key是"ap",那么ArrayList里就有{"apple","application"}
        TrieNode p = root;
        String temp;
        boolean contains=false;
        for (int i = 0; i < key.length(); i++) {
            temp=String.valueOf(key.charAt(i));
            contains=false;
            for(TrieNode tn:p.ptr){
                if(tn.value.equals(temp)){
                    p=tn;
                    contains=true;
                    break;
                }
            }
            if(contains){
                continue;
            }else{
                break;
            }
        }
        if(contains){
            if(!(p.ptr.isEmpty())){
                //查找到关键字
                searchResult.clear();
                tempWord.delete(0, tempWord.length());
                tempWord.append(key);
                start=key.length();
                traverseTree(p);
            }else{
                //已经查找到键树的底部
                return null;
            }
        }else{
            //没有查找到相应关键字
            return null;
        }
        return searchResult;
    }
    
    private void traverseTree(TrieNode p){
        if(!(p.ptr.isEmpty())){
            for(TrieNode tn:p.ptr){
                tempWord.append(tn.value);
                start++;
                traverseTree(tn);
                start--;
                tempWord.delete(start,tempWord.length());
            }
        }else{
            searchResult.add(tempWord.toString());
        }
    }
    public static void main(String[] args) {
        TrieTree_1 chinese = new TrieTree_1();
        chinese.insert("中");
        chinese.insert("中国人");
        chinese.insert("中国");
        chinese.insert("中华人民");
        chinese.insert("中华人崛起");
        chinese.insert("中华上下五千年");
        ArrayList<String> list = chinese.search("中华");
        for (String string : list) {
            System.out.println(string);
        }
    }
}

    原文作者:Trie树
    原文地址: https://blog.csdn.net/dreamzuora/article/details/85024533
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞