我正在开发一个日语词典应用程序,我正在尝试将汉字(在搜索栏上键入(与我的词典数据进行匹配。
为了给您一些上下文,以便匹配集めた(在搜索栏上键入(带有集める(Dictionary Data(,正如您所看到的,语法对单词进行了轻微的转换,因此很难匹配它们。所以我的计划是:
- 完整匹配单词[完成]
- 根据第一个字母匹配单词[完成]
- 根据第一个+第二个,第一个+第一个,然后第一个+二个+第三个来匹配单词
有什么办法可以做到这一点吗。提前感谢!
func updateSearchResults(for searchController: UISearchController) {
guard let text = searchController.searchBar.text else { return }
FilterDictionary = []
FilterDictionary += Dictionary.filter { $0.k_ele["keb"]!.contains(text) }.compactMap { $0 }
FilterDictionary += Dictionary.filter({ $0.k_ele["keb"]!.contains(where: { $0.hasPrefix(String(text.first ?? " "))
})}).compactMap{$0}
print(FilterDictionary)
tableView.reloadData()
}
您可以在字符串集合上构建一个扩展,该扩展将遍历搜索词的所有可能前缀,从搜索词本身开始:
extension Collection where Element: StringProtocol {
func matches<S: StringProtocol>(for search: S) -> [Element] {
// go over all possible prefixes, the most lengthy ones being first
// 0 means the exact word, 1..count are the rest
(0..<search.count).reduce(into: []) { results, offset in
let partialSearch = search.dropLast(offset)
results += filter { $0.hasPrefix(partialSearch) && !results.contains($0) }
}
}
}
用法:
myDictionary.values.matches(for: searchTerm)
结果将按匹配字符的降序排列:与完整搜索项匹配的将是第一个,匹配N-1秒的将是第二个,依此类推。列表中的最后一个将是只匹配第一个字符的,前面是匹配前两个字符的。