我有一个我正在制作的小项目的所有神奇宝贝的列表。现在我添加了一个搜索框,您可以在其中输入神奇宝贝的名称。我想根据搜索字符串对神奇宝贝列表进行排序。
例如,如果我搜索“bul”,我希望“Bulbasaur”位于顶部,然后是“Snubbull”和“Granbull”(因为他们的名字中也有“bul”),之后例如“Wobbufet”(因为他的名字中有“bu”)名称)。
我可以使用哪种字符串比较来实现此目的?
注意:我在 Elm 中工作,所以如果 Elm 中有一个解决方案那就太好了,但问题主要只是一般性的。
最佳答案
您可以构建一个函数,为列表中的每个项目分配权重,然后按该权重进行排序。您可以创建一个带有签名的函数:
assignWeight : String -> String -> (Int, String)
assignWeight typed listItem = ...
然后,该函数可以分配一个数值并将其作为元组的第一项返回,而原始值作为元组中的第二项。
然后您只需构建加权算法,并且这些规则必须根据您的要求来决定。
例如,您可以指定完全匹配 100。您可以指定部分匹配某个值,该值取决于键入的字符串匹配的数量以及实际匹配的字符数。您可以将 Regex 库用于所有这些场景,并使用 escape
函数构建部分正则表达式。
例如,完全匹配正则表达式可以定义为:
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
关于string-comparison - 比较字符串和搜索字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36112831/