Swift - фильтр с n сложностью - PullRequest
0 голосов
/ 27 февраля 2020

Итак, я хочу отфильтровать массив с n сложностью. Цель состоит в том, чтобы распознать дубликат карты (по идентификатору) и сохранить карту со статусом «а» и добавить его в массив (отфильтровать дубликат со статусом, отличным от «а»). У меня есть следующий код:

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») , Card (id: "45", статус: "a"), Card (id: "1234", статус: "c")]

Как и хотелось, но сложность не равна ^ 2. Есть ли способ снизить сложность?

1 Ответ

0 голосов
/ 27 февраля 2020

Используйте Dictionary's init(grouping:by:) и filter(_:) для получения ожидаемого result, т. Е.

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

Приведенный выше код имеет сложность O (n) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...