arraysswiftstandard-library

Removing duplicate elements from an array in Swift


I might have an array that looks like the following:

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

Or, really, any sequence of like-typed portions of data. What I want to do is ensure that there is only one of each identical element. For example, the above array would become:

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

Notice that the duplicates of 2, 6, and 15 were removed to ensure that there was only one of each identical element. Does Swift provide a way to do this easily, or will I have to do it myself?


Solution

  • You can roll your own, e.g. like this:

    func unique<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
    }
    
    let vals = [1, 4, 2, 2, 6, 24, 15, 2, 60, 15, 6]
    let uniqueVals = uniq(vals) // [1, 4, 2, 6, 24, 15, 60]
    

    And as an extension for Array:

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

    Or more elegantly (Swift 4/5):

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

    Which would be used:

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