Фильтровать пользовательскую оптимизацию времени массива - PullRequest
0 голосов
/ 04 января 2019

Мне нужно отфильтровать массив статей по ключевому слову (строке) в описании статьи.Фильтрация занимает 2-3 секунды для массива 1500+ элементов типа Article и 2000+ слов в описании каждой статьи.

Я использую приведенный ниже код;я также попробовал предикат, но у меня не получилось.

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 голосов
/ 04 января 2019

Это, вероятно, бит намного быстрее

let searchResult = articles.filter{ $0.title.range(of: text, options: .caseInsensitive) != nil 
                                 || $0.body.range(of: text, options: .caseInsensitive) != nil }
0 голосов
/ 04 января 2019

Проблема заключается в том, что вы вносите изменения в фильтруемую коллекцию.Вы не должны иметь 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...