/** * 创建DFA * @param keywordList * @throws UnsupportedEncodingException */ public void createKeywordTree(List<String> keywordList) { foreach (String keyword in keywordList) { if(keyword == null) continue; byte[] bytes = System.Text.Encoding.GetEncoding(charset).GetBytes(keyword.Trim()); TreeNode tempNode = rootNode; //循环每个字节 for (int i = 0; i < bytes.Length; i++) { int index = bytes[i] & 0xff; //字符转换成数字 TreeNode node = tempNode.getSubNode(index); if(node == null){ //没初始化 node = new TreeNode(); tempNode.setSubNode(index, node); } tempNode = node; if(i == bytes.Length - 1){ tempNode.setKeywordEnd(true); //关键词结束, 设置结束标志 } }//end for }//end for }
/// <summary> /// 向指定位置添加节点 /// </summary> /// <param name="index">位置索引</param> /// <param name="node">节点实例</param> public void setSubNode(int index, TreeNode node) { subNodes[index] = node; }
/// <summary> /// 创建过滤字词Byte树形 /// </summary> /// <param name="wordlist">过滤字词List集合</param> /// <returns></returns> private void CreateWordTree(List<string> wordlist) { //创建根节点 rootNode = new TreeNode(); foreach (String word in wordlist) { if (word == null) continue; byte[] word_bytes = Encoding.GetEncoding(CharSet).GetBytes(word.Trim()); TreeNode tempNode = rootNode; for (int i = 0; i < word_bytes.Length; i++) { int index = word_bytes[i] & 0xff; TreeNode node = tempNode.getSubNode(index); if (null == node) { node = new TreeNode(); tempNode.setSubNode(index, node); } //临时树为最后插入到节点中的树 tempNode = node; if (i + 1 == word_bytes.Length) { tempNode.setKeywordEnd(true); } } } }