Swift 4 - Фильтрация массива с помощью массива - PullRequest
0 голосов
/ 15 октября 2018

У меня есть список записей с идентификатором, и я хочу отфильтровать их до записей с идентификатором entry.id, совпадающим с одним из идентификаторов в selectedID.Есть ли способ сделать это с фильтром, или я должен использовать цикл for?

struct Entry {
    let id: String
}
var allEntries = [Entry]()
var selectedIDs = [String]

например

allEntries = [Entry(id: "1"), Entry(id:"2"), Entry(id:"3"), Entry(id:"4")]
selectedIDs = ["1", "3"]

// return selectedEntries
var selectedEntries = [Entry(id: "1"), Entry(id: "3")]

Ответы [ 3 ]

0 голосов
/ 15 октября 2018

В ответе Ракешы Шастри нет ничего плохого.По соображениям производительности вы можете захотеть сделать selectedIDs a Set вместо Array:

let allEntries = [Entry(id: "1"), Entry(id:"2"), Entry(id:"3"), Entry(id:"4")]
let selectedIDs: Set<String> = ["1", "3"]
let selectedEntries = allEntries.filter({ selectedIDs.contains($0.id) })

Причина в том, что поиск Array имеет вычислительную сложность O(n), гдеn - длина массива, в то время как поиск Set (т. Е. Хеш-таблицы) в среднем равен O(1) .

  • Если вы продолжитеselectedIDs как массив, общее решение имеет сложность O(n * m), где n и m являются длинами selectedIDs и allEntries соответственно.

  • Если вы используете Set, общая сложность уменьшается до O(m).

Сказав это, ваш пример слишком тривиален для того, чтобы оба метода могли что-то изменить.

0 голосов
/ 17 октября 2018

Вы можете использовать map (:) и filter (:) для достижения этого

let matchingEntries = allEntries.map({$0.id}).filter({selectedIDs.contains($0)})

.map вернет вам только идентификаторы в виде массива, затем .filter отфильтрует их с помощью selectedIDs

0 голосов
/ 15 октября 2018

Фильтр allEntries в зависимости от того, содержит ли selectedIDs id.

var allEntries = [Entry(id: "1"), Entry(id:"2"), Entry(id:"3"), Entry(id:"4")]
var selectedIDs = ["1", "3"]

var selectedEntries = allEntries.filter({ selectedIDs.contains($0.id) })
...