【问题标题】:Swift - filter with n complexitySwift - 复杂度为 n 的过滤器
【发布时间】:2020-02-27 12:53:20
【问题描述】:

所以我想过滤一个复杂度为 n 的数组。 目标是识别重复卡(通过 id)并保留状态为“a”的卡并将其添加到数组中(过滤掉状态与“a”不同的重复卡) 我的代码如下:

struct Card {
 var id:String
 var status:String

init(id:String, status:String) {
    self.id = id
    self.status = status
 }
}

let card1 = Card(id: "123", status: "a")
let card3 = Card(id: "43", status: "a")
let card4 = Card(id: "45", status: "a")
let card2 = Card(id: "123", status: "b")
let card5 = Card(id: "1234", status: "c")


let arrr = [card1,card3,card4,card2,card5]




func getCreditCardsOnly(creditCardsData:[Card]) -> [Card] {
var filter = [Card]()

for card in creditCardsData {
    if !filter.contains(where: {$0.id == card.id && $0.status != "b"}) {
        filter.append(card)
    }
}

 return filter
}

输出是:

卡(id:“123”,状态:“a”),卡(id:“43”,状态:“a”),卡(id:“45”,状态:“a”),卡( id:“1234”,状态:“c”)]

如您所愿,但复杂度为 n^2。 有没有办法降低复杂度?

【问题讨论】:

  • 所以如果数组中还有Card(id: "1", status: "b"),那应该保留在数组中,对吧?您只想过滤掉重复的statusb?如果有 2 张卡的 id 和状态相同,ac 怎么办?
  • @DávidPásztor ,是的,你说得对。如果有 2 张卡具有相同的 id 和 a 和 c 的状态,我也想要它们。不与状态 a 重复

标签: arrays swift filter code-complexity


【解决方案1】:

使用Dictionary'sinit(grouping:by:)filter(_:)得到预期的result,即

let result = Dictionary(grouping: arrr, by: { $0.status }).values.filter({ $0.first?.status != "b"})
print(result)

上面的代码复杂度O(n)

【讨论】:

  • @hi 我的答案是 [[__lldb_expr_19.Card(id: "45", status: "a")], [__lldb_expr_19.Card(id: "43", status: "a") ]] 如前所述,我还需要 Card(id: "123", status: "a")
  • 分组不正确...如果我这样添加花药卡: let card1 = Card(id: "123", status: "a") let card3 = Card(id: "43" , status: "a") let card4 = Card(id: "45", status: "a") let card2 = Card(id: "123", status: "b") let card5 = Card(id: "1234 ", status: "c") 我不会在 arr 中看到他
  • Kindy 更新问题,正确解释您要过滤的条件。目前还不清楚。
  • 是的。在其中编写代码并从中返回结果。
  • 不,仍然没有不同的答案
猜你喜欢
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 2017-01-17
  • 1970-01-01
  • 2011-07-20
相关资源
最近更新 更多