我有一个所有神奇宝贝的列表,我正在制作一个小项目。现在我添加了一个搜索框,您可以在其中键入神奇宝贝的名字。我想根据搜索字符串对神奇宝贝列表进行排序。
例如,如果我搜索“bul”,我会期望“ Bul basaur”位于顶部,然后是“Snub bul l” “Gran bul l”(因为他们的名字中也有“bul”),之后例如“Wob bu fet”(因为他的“bu”中有“bu”)名称)。
我可以使用哪种字符串比较?
注意:我在榆树工作,所以如果在Elm中有一个解决方案会很好,但问题主要是一般的。
答案 0 :(得分:2)
您可以构建一个函数,为列表中的每个项目分配权重,然后按此排序。您可以使用签名创建一个函数:
assignWeight : String -> String -> (Int, String)
assignWeight typed listItem = ...
然后,此函数可以指定一个数值并将其作为元组的第一项返回,原始值作为元组中的第二项。
然后你必须建立你的加权算法,这些规则必须由你的要求决定。
例如,您可以指定完全匹配100.您可以为部分匹配分配一些值,该值取决于键入的字符串匹配的数量以及实际匹配的字符数。您可以将Regex库用于所有这些场景,使用escape
函数构建部分正则表达式。
例如,完全匹配Regex可以定义为:
exactMatcher typed =
caseInsensitive <| regex <| "^" ++ escape typed ++ "$"
部分匹配可以是:
partialMatcher =
caseInsensitive << regex << escape
当您使用partialMatcher正则表达式时,您可以使用返回的Match index
值来确定匹配发生在字符串中的深度。
您甚至可以对输入的每个变体进行部分匹配(例如"bul"
,"bu"
和"b"
),并将其计入您的加权分数。
在一天结束时,您可以使用List.sortBy
和fst
来使用排序算法:
List.sortBy (fst << assignWeight "bu") pokemon