How do you count the amount of unique items in an Array?
Example:
let array:Array<Int> = [1,3,2,4,6,1,3,2]
Count function:
array.count
will give 8
but I want to count unique items and this will give 5
How do you count the amount of unique items in an Array?
Example:
let array:Array<Int> = [1,3,2,4,6,1,3,2]
Count function:
array.count
will give 8
but I want to count unique items and this will give 5
You can use NSSet to throw away duplicates:
let array:Array<Int> = [1,3,2,4,6,1,3,2]
let count = NSSet(array: array).count
println(count)
This prints:
5
As of Swift 1.2, Swift has a native Set
type. Use the Set
constructor to create a set from your array, and then the count
property will tell you how many unique items you have:
let array = [1,3,2,4,6,1,3,2]
let set = Set(array)
print(set.count) // prints "5"
For Swift 1.1 and earlier:
Turn your array into an NSSet
:
let array = [1,3,2,4,6,1,3,2]
let set = NSSet(array: array)
println(set.count) // prints "5"
You can read more about it here.
If you are interested in how many of each item you have, you can use a dictionary to count the items:
var counts = [Int:Int]()
for item in array {
counts[item] = (counts[item] ?? 0) + 1
}
print(counts) // prints "[6: 1, 2: 2, 3: 2, 1: 2, 4: 1]"
print(counts.count) // prints "5"
print("There are \(counts[1] ?? 0) ones.") // prints "There are 2 ones."
print("There are \(counts[7] ?? 0) sevens.") // prints "There are 0 sevens."
If you prefer to stick with pure swift, a possible solution consists of:
Translated in code:
let start: (Int, Int?) = (0, nil)
let count = array.sorted(<).reduce(start) { initial, value in
(initial.0 + (initial.1 == value ? 0 : 1), value)
}
let uniqueElements = count.0
the result is stored in the element 0 of the count
tuple.
Explanation: the start
tuple is initialized with 0
and nil
, and passed as the initial value to the reduce
method, called on a sorted copy of the array.
At each iteration, a new tuple is returned, containing the current array element and the current counter, increased by one if the current element is different than the previous one.