【问题标题】:Swift 4 - Filtering Array with ArraySwift 4 - 用数组过滤数组
【发布时间】:2018-10-15 06:53:41
【问题描述】:

我有一个条目列表,它们有一个 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")]

【问题讨论】:

    标签: swift swift4 higher-order-functions


    【解决方案1】:

    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),其中nm 分别是selectedIDsallEntries 的长度。

    • 如果您使用Set,整体复杂度会降低到O(m)

    话虽如此,您的示例对于任何一种方法都太微不足道了。

    【讨论】:

      【解决方案2】:

      根据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($0.id) })
      

      【讨论】:

      • 谢谢。出于好奇,如果说 selectedIDs 是另一种以 ID 作为属性的结构,这将如何更改 selectedIDs.contains($0.id) 部分?
      • map 然后filter
      • @user3628240 就像 Ashley 说的那样,您将结构数组映射到字符串数组,然后进行过滤。
      【解决方案3】:

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

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

      .map 将只返回 id 作为数组,然后 .filter 将使用 selectedIDs

      过滤它们

      【讨论】:

        【解决方案4】:

        Swift 5.5:

        let filteredArray = array.filter { self.selectedIDs.map(\.id).contains($0.id) }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-04
          • 2016-06-11
          • 1970-01-01
          • 1970-01-01
          • 2021-03-30
          相关资源
          最近更新 更多