Counting unique items in array. (Swift)

拟墨画扇 提交于 2019-12-19 06:04:30

问题


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


回答1:


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




回答2:


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."



回答3:


If you prefer to stick with pure swift, a possible solution consists of:

  1. sorting the array
  2. traversing the and count the number of times an element differs from the previous one

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.




回答4:


implement the function countDistinct(numbers: [Int]) to return the number of distinct elements in the array. NSSet documentation for Swift https://developer.apple.com/documentation/foundation/nsset

func countDistinct(numbers: [Int]) -> Int {
    let array:Array<Int> = numbers
    let count = NSSet(array: array).count
    return count
}

print(countDistinct(numbers: [20, 10, 10, 30, 20]))



回答5:


You can also use following generic method for counting unique values inside an array.

func countUniques<T: Comparable>(_ array: Array<T>) -> Int {
    let sorted = array.sorted()
    let initial: (T?, Int) = (.none, 0)
    let reduced = sorted.reduce(initial) {
        ($1, $0.0 == $1 ? $0.1 : $0.1 + 1)
    }
    return reduced.1
}


来源:https://stackoverflow.com/questions/27862499/counting-unique-items-in-array-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!