订单列表<t>由给定的模式与Trie

时间:2015-07-09 12:03:48

标签: c# search pattern-matching trie

我目前正在尝试在C#中实现一个结构,以按给定模式对通用列表进行排序。 具有最佳“得分”的条目位于列表的顶部,第二个条目具有第二大的得分,依此类推。

示例:

  • 搜索模式:“Fac”
  • 列出对象,每个对象都有属性“title”:
  • 可以说,这些物品的标题是“Facebook”,“家庭秋天”,“秋天”

搜索时,标题为“Facebook”的对象应该位于列表的顶部,第二个对象将是“Family Fall”,因为它的标题中有两次“Fa”模式。

有没有办法在C#中实现这样的结构? 我试图寻找几种算法,我甚至开始使用Trie结构,目前看起来像这样:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Sprung
{
    class WindowTrieNode : IComparable<WindowTrieNode>
    {
        private String pattern;
        private Char character;
        private List<WindowTrieNode> followers;

        public WindowTrieNode(String pattern, Char character)
        {
            this.pattern = pattern + character;
            this.character = character;
            this.followers = new List<WindowTrieNode>();
        }

        public void addFollower(WindowTrieNode follower) {
            if(!hasFollower(follower.getChar())) {
                this.followers.Add(follower);
            }
        }

        public bool hasFollowers()
        {
            return !this.followers.Any();
        }

        public bool hasFollower(Char character)
        {
            if (!hasFollowers()) return false;
            WindowTrieNode node = new WindowTrieNode(this.pattern + character, character);
            return this.followers.Contains(node);
        }

        public WindowTrieNode getFollower(Char character)
        {
            WindowTrieNode node = new WindowTrieNode(this.pattern + character, character);
            if (hasFollower(character)) return followers.ElementAt(this.followers.IndexOf(node));
            return null;
        }

        public Char getChar()
        {
            return this.character;
        }

        public int CompareTo(WindowTrieNode n) {
            // Not yet implemented.
            return 0;
        }
    }
}

这是一种正确的方法吗?有更好的方法和解决方案吗? 非常感谢。

另一种方法是Approximate String Matching

0 个答案:

没有答案