我有一个类型[Patient]
的数组,其结构如下:
struct Patients {
var name: String
var lastName: String
var age: Int
var indexed: String
}
var"索引"等于:
name + " " + lastName + " " + age
我有一个searchTextField,它通过过滤结果来搜索数组:
let search = self.searchText.stringValue
return arrayOfPatients.filter(){
$0.index.localizedStandardContains(search)
}
如果我在array.indexed中有这些行:
Jon McDonalds 18
Jon Gomez 18
Jon Gomez 37
Tom Gomez 28
如果我搜索" Jon 18"它没有返回结果。或者,如果我搜索" Gomez Jon"它没有返回结果。
我想搜索,例如" 18 Jon"并检索所有18岁的Jon患者。
如何改进算法以逐字搜索字符串,忽略空格?
答案 0 :(得分:0)
检查这是否适合您。 基本上,搜索字符串的每个单词都与每个患者的索引属性的每个单词进行比较。
如果索引属性包含搜索字符串中的所有单词,则返回true。
以下是相关代码:
let searchStringSeparated = search.components(separatedBy: " ")
let results = arrayOfPatients.filter(){ patient in
!searchStringSeparated.map{ word in
patient.indexed.components(separatedBy: " ").map{
$0.localizedStandardContains(word)
}.contains(true)
}.contains(false)
}
答案 1 :(得分:0)
代码非常快速,简洁和高效。唯一的#34; bug"就是当我在searchTextField中引入一个空格时,它会将该空格解释为空单词,因此在searchStringSeparated中返回值为,例如:
["Jon", ""]
所以,结果是零。将此代码添加到函数中是必要的:
let lastIndexOfSearchStringsArray = searchStringsSeparated.count - 1
if searchStringSeparated[lastIndexOfSearchStringsArray] == "" {
searchStringSeparated.removeLast()
} else {
}
非常感谢你的回答。