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

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 ptr = null;

public TrieNode(String value) {

this.value=value;

ptr =new ArrayList();

}

}

public class TrieTree_1 {

private static TrieNode root = null;

ArrayList searchResult=new ArrayList();

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 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 list = chinese.search("中华");

for (String string : list) {

System.out.println(string);

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值