我从特定类中获得了一系列元素。我想按顺序比较元素,如果后一个元素在特定属性中具有相等或是最后一个,则将其删除。
例如在具有不同颜色的元素数组中。我要删除绿色元素的末端,并排删除绿色元素。
我使用一个while循环来检查并询问是否有更好的快速方法。我认为也许可以使用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
}
答案 0 :(得分:1)
您的方法似乎很快,因为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()
}
}