コード例 #1
0
 private LogTrie __findChild(string str, bool useWildcard)
 {
     if (m_children != null)
     {
         for (int i = 0; i < m_children.Count; i++)
         {
             LogTrie child = m_children[i];
             if (child.m_str == str || (useWildcard && child.m_str == "*"))
             {
                 return(child);
             }
         }
     }
     return(null);
 }
コード例 #2
0
        private bool __addPath(string path, int startIndex)
        {
            if (path.Length - startIndex <= 0)
            {
                return(false);
            }

            // 找到第一个'.'的位置
            int pos = path.IndexOf('.', startIndex);

            if (pos == startIndex)  // 头一个字符就是'.',视为非法输入
            {
                return(false);
            }

            // 得到'.'前面的部分,例如"foo"
            string str;

            if (pos != -1)
            {
                str = path.Substring(startIndex, pos - startIndex);
            }
            else
            {
                str = path.Substring(startIndex, path.Length - startIndex);
            }

            // 不允许非终结节点为"*"
            if (str == "*" && pos != -1)
            {
                return(false);
            }

            // 查找str是否为一个已经存在的child,若不存在则新建之
            LogTrie child = __getChild(str);

            if (pos != -1)
            {
                // 递归处理余下的path
                return(child.__addPath(path, pos + 1));
            }
            else
            {
                // 置上终结符标志
                child.m_terminal = true;
                return(true);
            }
        }
コード例 #3
0
        private bool __find(string path, int startIndex)
        {
            if (path.Length - startIndex <= 0)
            {
                return(false);
            }

            // 找到第一个'.'的位置
            int pos = path.IndexOf('.', startIndex);

            if (pos == startIndex)  // 头一个字符就是'.',视为非法输入
            {
                return(false);
            }

            // 得到'.'前面的部分,例如"foo"
            string str;

            if (pos != -1)
            {
                str = path.Substring(startIndex, pos - startIndex);
            }
            else
            {
                str = path.Substring(startIndex, path.Length - startIndex);
            }

            // 查找str是否为一个已经存在的child
            LogTrie child = __findChild(str, true);

            if (child == null)
            {
                return(false);
            }

            if (pos != -1 && child.m_str != "*")
            {
                // 递归处理余下的path
                return(child.__find(path, pos + 1));
            }
            else
            {
                // path已经结束,若当前节点是一个终结符节点,则说明找到
                return(child.m_terminal);
            }
        }
コード例 #4
0
        private void __pathList(ref List <string> pathList, string baseStr)
        {
            if (m_children == null)
            {
                return;
            }

            for (int i = 0; i < m_children.Count; i++)
            {
                LogTrie child = m_children[i];
                string  str   = baseStr + child.m_str;
                if (child.m_terminal)
                {
                    pathList.Add(str);
                }
                child.__pathList(ref pathList, str + ".");
            }
        }
コード例 #5
0
        private LogTrie __getChild(string str)
        {
            LogTrie child = __findChild(str, false);

            if (child != null)
            {
                return(child);
            }

            if (m_children == null)
            {
                m_children = new List <LogTrie>();
            }

            child       = new LogTrie();
            child.m_str = str;

            m_children.Add(child);

            return(child);
        }
コード例 #6
0
        private bool __removePath(string path, int startIndex)
        {
            if (path.Length - startIndex <= 0)
            {
                return(false);
            }

            // 找到第一个'.'的位置
            int pos = path.IndexOf('.', startIndex);

            if (pos == startIndex)  // 头一个字符就是'.',视为非法输入
            {
                return(false);
            }

            // 得到'.'前面的部分,例如"foo"
            string str;

            if (pos != -1)
            {
                str = path.Substring(startIndex, pos - startIndex);
            }
            else
            {
                str = path.Substring(startIndex, path.Length - startIndex);
            }

            // 查找str是否为一个已经存在的child
            LogTrie child = __findChild(str, false);

            if (child == null)
            {
                return(false);
            }

            if (pos != -1)
            {
                // 递归处理余下的path
                if (!child.__removePath(path, pos + 1))
                {
                    return(false);
                }
            }
            else
            {
                // 去掉终结符标志
                child.m_terminal = false;
            }

            // 移除子节点中的非终结符叶子节点
            for (int i = 0; i < m_children.Count; i++)
            {
                child = m_children[i];
                if (!child.m_terminal && (child.m_children == null || child.m_children.Count == 0))
                {
                    m_children.RemoveAt(i);
                    i--;
                }
            }

            return(true);
        }