比较集合中的元素并通过检查属性删除

时间:2019-02-08 10:22:18

标签: ios arrays swift collections

我从特定类中获得了一系列元素。我想按顺序比较元素,如果后一个元素在特定属性中具有相等或是最后一个,则将其删除。

例如在具有不同颜色的元素数组中。我要删除绿色元素的末端,并排删除绿色元素。

我使用一个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
}

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()
    }
}