有没有更快的方法来查找字符串中以字符串开头的单词?
Is there a faster method to find words beginning with string inside a string?
我在 Core Data 上有一个名为 keywords
的字段,用于存储由空格分隔的关键字,例如:
car nascar race daytona crash
我有一个由核心数据填充的列表。该列表中的每个元素都有关键字。
我在该视图上有一个搜索字段。
我希望在用户输入时过滤该列表。
如果用户键入 c
,应用程序将检查关键字以 c
开头的元素。在这种情况下,上面提到的元素将被显示,因为它有 car
和 crash
,两者都以 c
.
开头
为了检查这一点,我创建了这个扩展程序
extension String {
func containsWordStartingWith(insensitive searchWord: String) -> Bool {
let lowercaseSelf = self.lowercased().trimmingCharacters(in: .whitespaces)
let lowercaseSearch = searchWord.lowercased().trimmingCharacters(in: .whitespaces)
let array = lowercaseSelf.components(separatedBy: " ")
return array.contains(where: {[=11=].hasPrefix(lowercaseSearch)})
}
}
这可行,但速度非常慢,而且在搜索栏上键入字符会使应用停止运行。
我怎样才能更快地改进它?
我要做的第一件事是将单个关键字字符串拆分为一组实际关键字。如果可能的话,您甚至应该以这种方式将其存储在核心数据中,因此不需要拆分步骤。
let keywords = "car nascar race daytona crash"
let keywordSet = Set(keywords.split(separator: " "))
现在你想要的实用方法是简单而快速的:
func keywordSet(_ set : Set<Substring>, containsWordStartingWith s: Substring) -> Bool {
for keyword in set {
if keyword.hasPrefix(s) { return true }
}
return false
}
测试:
keywordSet(keywordSet, containsWordStartingWith:"c")
我在 Core Data 上有一个名为 keywords
的字段,用于存储由空格分隔的关键字,例如:
car nascar race daytona crash
我有一个由核心数据填充的列表。该列表中的每个元素都有关键字。
我在该视图上有一个搜索字段。
我希望在用户输入时过滤该列表。
如果用户键入 c
,应用程序将检查关键字以 c
开头的元素。在这种情况下,上面提到的元素将被显示,因为它有 car
和 crash
,两者都以 c
.
为了检查这一点,我创建了这个扩展程序
extension String {
func containsWordStartingWith(insensitive searchWord: String) -> Bool {
let lowercaseSelf = self.lowercased().trimmingCharacters(in: .whitespaces)
let lowercaseSearch = searchWord.lowercased().trimmingCharacters(in: .whitespaces)
let array = lowercaseSelf.components(separatedBy: " ")
return array.contains(where: {[=11=].hasPrefix(lowercaseSearch)})
}
}
这可行,但速度非常慢,而且在搜索栏上键入字符会使应用停止运行。
我怎样才能更快地改进它?
我要做的第一件事是将单个关键字字符串拆分为一组实际关键字。如果可能的话,您甚至应该以这种方式将其存储在核心数据中,因此不需要拆分步骤。
let keywords = "car nascar race daytona crash"
let keywordSet = Set(keywords.split(separator: " "))
现在你想要的实用方法是简单而快速的:
func keywordSet(_ set : Set<Substring>, containsWordStartingWith s: Substring) -> Bool {
for keyword in set {
if keyword.hasPrefix(s) { return true }
}
return false
}
测试:
keywordSet(keywordSet, containsWordStartingWith:"c")