【问题标题】:Filter Custom Array time optimization过滤自定义阵列时间优化
【发布时间】:2019-01-04 08:03:43
【问题描述】:

我必须根据文章描述中的关键字(字符串)过滤文章数组。过滤文章类型的 1500 多个元素数组和每篇文章描述中的 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 秒。

【问题讨论】:

    标签: arrays swift string filter


    【解决方案1】:

    这可能比 bit 快很多

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

    【讨论】:

      【解决方案2】:

      问题在于您对正在过滤的集合执行了更改。您不应该在过滤器功能中有articleList.remove() 和articleList.append()。 filter 的工作方式是,您只需为要保留在过滤集合中的每个元素(在您的情况下为 searchResult)返回 true,其余部分返回 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
      }
      

      【讨论】:

        猜你喜欢
        • 2011-10-20
        • 2020-03-26
        • 2019-03-21
        • 2018-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-04
        • 2019-11-17
        相关资源
        最近更新 更多