Skip to content

Instantly share code, notes, and snippets.

@akhilcb
Created February 25, 2017 05:53
Show Gist options
  • Save akhilcb/3c9889c1a7c44108a628a9a83a2d0ad5 to your computer and use it in GitHub Desktop.
Save akhilcb/3c9889c1a7c44108a628a9a83a2d0ad5 to your computer and use it in GitHub Desktop.
Array/Sequence Extension Swift for mapUnique function to get unique and distinct properties mapped from any data structure which inherits Sequence
public extension Sequence {
public func mapUnique<T: Equatable>(_ transform: (Iterator.Element) -> T) -> [T] {
var result: [T] = []
//takes O(n^2) time since T is not Hashable type
for element in self {
let transformedElement: T = transform(element)
if result.contains(transformedElement) {
continue
}
result.append(transformedElement)
}
return result
}
public func mapUnique<T: Hashable>(_ transform: (Iterator.Element) -> T) -> [T] {
var result: [T] = []
var tempSet = Set<T>()
//takes O(n) time using Set
for element in self {
let transformedElement: T = transform(element)
if tempSet.contains(transformedElement) {
continue
}
result.append(transformedElement)
tempSet.insert(transformedElement)
}
return result
}
}
public extension Sequence where Iterator.Element: Equatable {
public func unique() -> [Iterator.Element] {
var result: [Iterator.Element] = []
//takes O(n^2) time since element is not Hashable type
for element in self {
if result.contains(element) {
continue
}
result.append(element)
}
return result
}
}
public extension Sequence where Iterator.Element: Hashable {
public func unique() -> [Iterator.Element] {
var result: [Iterator.Element] = []
var tempSet = Set<Iterator.Element>()
//takes O(n) time using Set
for element in self {
if tempSet.contains(element) {
continue
}
result.append(element)
tempSet.insert(element)
}
return result
}
}
@akhilcb
Copy link
Author

akhilcb commented Feb 25, 2017

Here is an example. The output maintains same order as that of array.

Input:

class Data {
    var name: String!
    var id: Int!
    
    convenience init(name: String, id: Int) {
        self.init()
        self.name = name
        self.id = id
    }
}

let array = [Data(name: "ab", id: 23),
             Data(name: "ab", id: 24),
             Data(name: "cd", id: 25),
             Data(name: "ef", id: 26),
             Data(name: "ef", id: 27),
             Data(name: "ef", id: 28),
             Data(name: "gh", id: 29)]
let nameArray = array.mapUnique { $0.name }
print(nameArray)

Output:

["ab", "cd", "ef", "gh"]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment