一尘不染

在Swift中从数组中删除重复的元素

swift

如今,在Swift中,您只需键入 Set( yourArray ) 以使数组唯一。(或根据需要订购)。

在此之前,它是怎么做的?


我可能有一个如下所示的数组:

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

或者,实际上,是数据的相似类型部分的任何序列。我要做的是确保每个相同元素中只有一个。例如,上面的数组将变为:

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

请注意,删除了2、6和15的重复项以确保每个相同元素中只有一个。Swift是否提供一种轻松实现此目的的方法,还是我必须自己做?


阅读 864

收藏
2020-07-07

共1个答案

一尘不染

您可以自己滚动,例如这样( 已针对Swift 1.2的Set进行了更新 ):

func uniq<S : SequenceType, T : Hashable where S.Generator.Element == T>(source: S) -> [T] {
    var buffer = [T]()
    var added = Set<T>()
    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]

Swift 3版本:

func uniq<S : Sequence, T : Hashable>(source: S) -> [T] where S.Iterator.Element == T {
    var buffer = [T]()
    var added = Set<T>()
    for elem in source {
        if !added.contains(elem) {
            buffer.append(elem)
            added.insert(elem)
        }
    }
    return buffer
}

并作为扩展Array

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