Сравнить элементы в коллекции и удалить, проверив свойства - PullRequest
0 голосов
/ 08 февраля 2019

Я получил массив элементов из определенного класса.Я хочу сравнить элементы по порядку и удалить их, если последующее имеет равенство в определенном свойстве или является последним.

Например, в массиве элементов с разными цветами.Я хочу удалить зеленые элементы в конце и зеленые элементы рядом.

Я использую цикл while для проверки и запроса, есть ли лучший способ в swift.Я думаю, возможно с reduce вы могли бы построить новый массив, но будет ли он быстрее?Вот пример кода.

struct Car {
    var color: UIColor
}

var someCars = [Car(color: .blue), Car(color: .green), Car(color: .green), Car(color: .yellow), Car(color: .blue), Car(color: .green)]

var ix:Int = someCars.count - 1
while ix >= 0 {
    if someCars[ix].color == .green && (ix == someCars.count - 1 || someCars[ix + 1].color == .green) {
        someCars.remove(at: ix)
    }
    ix -= 1
}

1 Ответ

0 голосов
/ 08 февраля 2019

Ваш метод кажется быстрым, имеет O (n)

, но читаемость может быть улучшена, возможно.Это может быть проще, а также сразу удаляет все записи, которые имеют тот же цвет, что и предыдущий элемент.Так что работает для зеленого, синего и т. Д.

var filtered:[Car] = []

someCars.forEach { (car) in

    if filtered.count == 0 {
        filtered.append(car)
    }

    if let last = filtered.last {
        if last.color != car.color {
            filtered.append(car)
        }
    }
}


//then, if needed remove the first and last entry if they are green
if let last = filtered.last, let first = filtered.first {
    if last.color == .green {
        filtered.removeLast()
    }
    if first.color == .green {
        filtered.removeFirst()
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...