【问题标题】:Comparing a String to a List of Words将字符串与单词列表进行比较
【发布时间】:2018-02-20 20:24:25
【问题描述】:

我正在尝试在我正在编写的程序中实现搜索功能。目前,我有一个正在搜索的字符串列表。

我想做的是检查在搜索框中输入的所有字是否出现在搜索结果中。然而,问题是它们可以以任何顺序出现。例如,如果字符串是:

敏捷的棕狐跳过懒狗

我要输入:

狗狐棕色

它会返回一个肯定的匹配。

我的第一个念头是把.split搜索框中的词组成一个数组。然后,遍历字符串列表,并检查字符串是否包含数组中的每个单词,否则,将其从列表中删除。遍历完所有字符串后,显示结果。

但是,我可以想象会有大量开销,特别是因为我希望实时完成过滤,即。附加到文本框的 TextChanged 事件。

有没有更有效的过滤方式?我只是想确保在开始编码之前没有更有效的方法来执行此操作。

【问题讨论】:

  • 如果您要拆分和迭代项目,您应该在这样做之前订购两个集合,然后您可以应用更智能的算法而不是检查每个项目...
  • 嗨@Alisson。您的意思是拆分两个字符串,对结果数组进行排序,然后进行数组比较?
  • HashSet class 可以在这里派上用场。与列表不同,您不需要遍历整个HashSet 来查看是否存在某个项目(从而为您节省大量处理能力)。只需致电HashSet.Contains(),框架就会为您处理查找问题。
  • @VisualVincent 很有趣,不知道哈希集可以使用Contains() 函数以这种方式做到这一点。我认为它仅在检查相等性时才有效。
  • 我的错,我误读了这个问题。使用HashSet 只有在事先 为每个字符串构建一个时才会有利可图。否则你最初的想法是最快的,@Aommaster。

标签: vb.net string-comparison


【解决方案1】:

我在 Linq 中提议 Regex.Matches().Count .Select().Sum()

鉴于提供的输入字符串:

敏捷的棕狐跳过懒惰的狗

计算该字符串中匹配的模式数量以及模式(单词)的数量。

给定字符串中包含的模式:(并假设分隔符为chr(32)

狗狐棕色

Imports System.Text.RegularExpressions

Dim words As Integer
Dim NumberOfMatches As Integer = GetMatchingWords(
                                 "The quick brown fox jumps over the lazy dog",
                                 "dog fox brown",
                                 words)


Public Function GetMatchingWords(TextToSearch As String, WordsToMatch As String, ByRef words As Integer) As Integer

    words = Regex.Matches(WordsToMatch, ChrW(32)).Count + 1
    Return WordsToMatch.Split(ChrW(32)).Select(
           Function(word) Regex.Matches(TextToSearch, word).Cast(Of Match)().Count()).Sum()
End Function

此函数返回:

words = 3
NumberOfMatches = 3<br>

【讨论】:

  • 谢谢!我能够对此进行一些小优化。函数内部不需要words = Regex.Matches(WordsToMatch, Chr(32)).Count + 1,因为搜索词是相同的。所以我把它搬走了。不确定这是否会产生重大影响,但我想为什么不会。
  • 好吧,我在您看到的编辑中添加了该计数。我不确定您是否想将单词数与匹配数进行比较。或者,如果您在某个时候需要该数字参考。如果你不这样做,代码越少越好:)
  • 注意!非常感谢!
猜你喜欢
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 2014-08-13
  • 2021-10-17
  • 2021-08-27
  • 2020-12-18
相关资源
最近更新 更多