计算数组中的唯一项。 (迅速)
Counting unique items in array. (Swift)
如何计算数组中唯一项的数量?
示例:
let array:Array<Int> = [1,3,2,4,6,1,3,2]
计数函数:
array.count
会给出 8
但我想计算独特的项目,这将给出 5
自 Swift 1.2 起,Swift 具有原生 Set
类型。使用 Set
构造函数从您的数组创建一个集合,然后 count
属性 将告诉您您有多少个独特的项目:
let array = [1,3,2,4,6,1,3,2]
let set = Set(array)
print(set.count) // prints "5"
对于 Swift 1.1 及更早版本:
将你的数组变成 NSSet
:
let array = [1,3,2,4,6,1,3,2]
let set = NSSet(array: array)
println(set.count) // prints "5"
您可以阅读更多相关信息 here。
如果您对每件物品的数量感兴趣,可以使用字典来统计物品数量:
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."
您可以使用 NSSet 删除重复项:
let array:Array<Int> = [1,3,2,4,6,1,3,2]
let count = NSSet(array: array).count
println(count)
这会打印:
5
如果您更愿意坚持使用 纯 swift,可能的解决方案包括:
- 排序数组
- 遍历并计算一个元素与前一个元素不同的次数
翻译成代码:
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
结果存储在 count
元组的元素 0 中。
说明:start
元组用 0
和 nil
初始化,并作为初始值传递给 reduce
方法,在排序副本上调用阵列。
在每次迭代中,返回一个新元组,其中包含当前数组元素和当前计数器,如果当前元素与前一个元素不同,则增加 1。
您还可以使用以下通用方法计算数组内的唯一值。
func countUniques<T: Comparable>(_ array: Array<T>) -> Int {
let sorted = array.sorted()
let initial: (T?, Int) = (.none, 0)
let reduced = sorted.reduce(initial) {
(, [=10=].0 == ? [=10=].1 : [=10=].1 + 1)
}
return reduced.1
}
实现函数
countDistinct(numbers: [Int]) 到 return 中不同元素的数量
阵列。
Swift 的 NSSet 文档
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]))
如何计算数组中唯一项的数量?
示例:
let array:Array<Int> = [1,3,2,4,6,1,3,2]
计数函数:
array.count
会给出 8
但我想计算独特的项目,这将给出 5
自 Swift 1.2 起,Swift 具有原生 Set
类型。使用 Set
构造函数从您的数组创建一个集合,然后 count
属性 将告诉您您有多少个独特的项目:
let array = [1,3,2,4,6,1,3,2]
let set = Set(array)
print(set.count) // prints "5"
对于 Swift 1.1 及更早版本:
将你的数组变成 NSSet
:
let array = [1,3,2,4,6,1,3,2]
let set = NSSet(array: array)
println(set.count) // prints "5"
您可以阅读更多相关信息 here。
如果您对每件物品的数量感兴趣,可以使用字典来统计物品数量:
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."
您可以使用 NSSet 删除重复项:
let array:Array<Int> = [1,3,2,4,6,1,3,2]
let count = NSSet(array: array).count
println(count)
这会打印:
5
如果您更愿意坚持使用 纯 swift,可能的解决方案包括:
- 排序数组
- 遍历并计算一个元素与前一个元素不同的次数
翻译成代码:
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
结果存储在 count
元组的元素 0 中。
说明:start
元组用 0
和 nil
初始化,并作为初始值传递给 reduce
方法,在排序副本上调用阵列。
在每次迭代中,返回一个新元组,其中包含当前数组元素和当前计数器,如果当前元素与前一个元素不同,则增加 1。
您还可以使用以下通用方法计算数组内的唯一值。
func countUniques<T: Comparable>(_ array: Array<T>) -> Int {
let sorted = array.sorted()
let initial: (T?, Int) = (.none, 0)
let reduced = sorted.reduce(initial) {
(, [=10=].0 == ? [=10=].1 : [=10=].1 + 1)
}
return reduced.1
}
实现函数 countDistinct(numbers: [Int]) 到 return 中不同元素的数量 阵列。 Swift 的 NSSet 文档 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]))