Created
February 25, 2017 05:53
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Here is an example. The output maintains same order as that of array.
Input:
Output: