Swift 4-使用数组过滤数组

时间:2018-10-15 06:53:42

标签: swift swift4 higher-order-functions

我有一个具有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")]

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),其中nmselectedIDs的长度和allEntries

  • 如果使用Set,则总体复杂度将降低为O(m)

话虽如此,您的示例对于任何一种方法都无济于事。

答案 2 :(得分:0)

您可以使用map(:) filter( :)来实现

number1 name a 1 2 3 
number1 name b 1 2 3
number1 name c 1 2 3
number2 name a 1 2 3
number2 name b 1 2 3
number3 name a 1 2 3
....
number5 name c 1 2 3

.map 将返回ID只是一个数组,然后 .filter 将使用 selectedID

对其进行过滤