Swift 4 - 用数组过滤数组
Swift 4 - Filtering Array with Array
我有一个条目列表,其中有一个 ID,我想将它们过滤为 entry.id 与 selectedIDs 中的一个 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")]
根据 selectedIDs
是否包含 id
.
过滤 allEntries
var allEntries = [Entry(id: "1"), Entry(id:"2"), Entry(id:"3"), Entry(id:"4")]
var selectedIDs = ["1", "3"]
var selectedEntries = allEntries.filter({ selectedIDs.contains([=10=].id) })
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([=10=].id) })
原因是搜索Array
的计算复杂度为O(n)
,其中n
是数组的长度,而搜索Set
(即a hash table) 平均 O(1)
.
如果将 selectedIDs
保留为数组,则整体解决方案的复杂度为 O(n * m)
,其中 n
和 m
是 selectedIDs
和 allEntries
。
如果使用Set
,整体复杂度降低到O(m)
。
话虽如此,您的示例对于任何一种方法来说都太微不足道了。
您可以使用map(:) and filter(:)来实现这个
let matchingEntries = allEntries.map({[=10=].id}).filter({selectedIDs.contains([=10=])})
.map 将 return 你只是将 id 作为一个数组,然后 .filter 将使用 selectedIDs
Swift 5.5:
let filteredArray = array.filter { self.selectedIDs.map(\.id).contains([=10=].id) }
我有一个条目列表,其中有一个 ID,我想将它们过滤为 entry.id 与 selectedIDs 中的一个 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")]
根据 selectedIDs
是否包含 id
.
allEntries
var allEntries = [Entry(id: "1"), Entry(id:"2"), Entry(id:"3"), Entry(id:"4")]
var selectedIDs = ["1", "3"]
var selectedEntries = allEntries.filter({ selectedIDs.contains([=10=].id) })
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([=10=].id) })
原因是搜索Array
的计算复杂度为O(n)
,其中n
是数组的长度,而搜索Set
(即a hash table) 平均 O(1)
.
如果将
selectedIDs
保留为数组,则整体解决方案的复杂度为O(n * m)
,其中n
和m
是selectedIDs
和allEntries
。如果使用
Set
,整体复杂度降低到O(m)
。
话虽如此,您的示例对于任何一种方法来说都太微不足道了。
您可以使用map(:) and filter(:)来实现这个
let matchingEntries = allEntries.map({[=10=].id}).filter({selectedIDs.contains([=10=])})
.map 将 return 你只是将 id 作为一个数组,然后 .filter 将使用 selectedIDs
Swift 5.5:
let filteredArray = array.filter { self.selectedIDs.map(\.id).contains([=10=].id) }