我有一个具有ID的条目列表,我想将其过滤为具有与selectedID中的ID之一匹配的entry.id的条目。有没有办法用过滤器做到这一点,或者我必须使用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")]
答案 0 :(得分:4)
根据for
是否包含allEntries
来过滤selectedIDs
。
id
答案 1 :(得分:3)
Rakesha Shastri的回答没有错。出于性能原因,您可能希望将selectedIDs
设为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)
。
话虽如此,您的示例对于任何一种方法都无济于事。
答案 2 :(得分:0)