使用 Swift 从数组中删除重复元素

10 浏览
0 Comments

使用 Swift 从数组中删除重复元素

我可能会有一个看起来像以下的数组:

[1, 4, 2, 2, 6, 24, 15, 2, 60, 15, 6]

实际上,任何具有相同数据类型的序列都可以。我想要做的是确保每个相同元素只有一个。例如,上述数组将变为:

[1, 4, 2, 6, 24, 15, 60]

请注意,为了确保每个相同元素只有一个,2、6和15的重复项被删除了。Swift是否提供了一种轻松的方法来完成此操作,或者我必须自己完成?

admin 更改状态以发布 2023年5月20日
0
0 Comments

你可以自行编写,例如这样:

func unique(source: S) -> [T] where S.Iterator.Element == T {
    var buffer = [T]()
    var added = Set()
    for elem in source {
        if !added.contains(elem) {
            buffer.append(elem)
            added.insert(elem)
        }
    }
    return buffer
}
let vals = [1, 4, 2, 2, 6, 24, 15, 2, 60, 15, 6]
let uniqueVals = uniq(vals) // [1, 4, 2, 6, 24, 15, 60]

作为 Array 的扩展:

extension Array where Element: Hashable {
    func uniqued() -> Array {
        var buffer = Array()
        var added = Set()
        for elem in self {
            if !added.contains(elem) {
                buffer.append(elem)
                added.insert(elem)
            }
        }
        return buffer
    }
}

或使用更优雅的方式(适用于 Swift 4/5):

extension Sequence where Element: Hashable {
    func uniqued() -> [Element] {
        var set = Set()
        return filter { set.insert($0).inserted }
    }
}

它会被使用:

[1,2,4,2,1].uniqued()  // => [1,2,4]

0
0 Comments

你可以很容易地将数组转换为 Set,然后再转换回 Array

let unique = Array(Set(originals))

但这不能保证数组的原始顺序。

0