逐字逐句搜索

时间:2018-01-15 23:49:43

标签: arrays swift

我有一个类型[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患者。

如何改进算法以逐字搜索字符串,忽略空格?

2 个答案:

答案 0 :(得分:0)

检查这是否适合您。 基本上,搜索字符串的每个单词都与每个患者的索引属性的每个单词进行比较。

如果索引属性包含搜索字符串中的所有单词,则返回true。

enter image description here

以下是相关代码:

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 { 
}

非常感谢你的回答。