过滤器自定义阵列时间优化

时间:2019-01-04 08:03:44

标签: arrays swift string filter

我必须根据文章描述中的关键字(字符串)过滤文章数组。在1500种元素的Article类型数组和每个文章描述中2000多个单词的过滤过程中,需要2-3秒的时间。

我正在使用以下代码;我也尝试过谓词,但没有为我工作。

let searchResult = articlesList.filter {
    let article = $0

    let filterByName = article.title.lowercased().range(of: text.lowercased())
    let filterByDescription = article.body.lowercased().range(of: (text.lowercased()))
    if ((filterByName != nil) || filterByDescription != nil) {
        if !articlesList.contains(article) {
            articlesList.append(article)
        }
    }
    else {
        let index = articlesList.index(of: article)
        if index != nil {
            articlesList.remove(at: index!)
        }
    }

    return false
}

我希望过滤时间最长不超过0.3秒。

2 个答案:

答案 0 :(得分:3)

这可能快了许多

let searchResult = articles.filter{ $0.title.range(of: text, options: .caseInsensitive) != nil 
                                 || $0.body.range(of: text, options: .caseInsensitive) != nil }

答案 1 :(得分:1)

问题是您对要过滤的集合执行更改。过滤器功能中不应包含articleList.remove()articleList.append()filter的工作方式是,对于要保留在过滤后的集合中的每个元素(在您的情况下为true)中,您只返回searchResult,对于其余元素,则返回false

尝试此代码:

let searchResult = articlesList.filter { article in
    let filterByName = article.title!.lowercased().range(of: text.lowercased())
    let filterByDescription = article.body!.lowercased().range(of: (text.lowercased()))
    if ((filterByName != nil) || filterByDescription != nil){
        return true
    }
    return false
}