vac*_*ama 97
Swift 3和Swift 2:
您可以使用类型字典为您的[String: Int]
每个项目建立计数[String]
:
let arr = ["FOO", "FOO", "BAR", "FOOBAR"]
var counts: [String: Int] = [:]
for item in arr {
counts[item] = (counts[item] ?? 0) + 1
}
print(counts) // "[BAR: 1, FOOBAR: 1, FOO: 2]"
for (key, value) in counts {
print("\(key) occurs \(value) time(s)")
}
Run Code Online (Sandbox Code Playgroud)
输出:
BAR occurs 1 time(s)
FOOBAR occurs 1 time(s)
FOO occurs 2 time(s)
Run Code Online (Sandbox Code Playgroud)
斯威夫特4:
Swift 4 引入了(SE-0165)通过字典查找包含默认值的能力,并且可以使用诸如+=
和的操作来改变结果值-=
,因此:
counts[item] = (counts[item] ?? 0) + 1
Run Code Online (Sandbox Code Playgroud)
变为:
counts[item, default: 0] += 1
Run Code Online (Sandbox Code Playgroud)
这样可以很容易地使用forEach
以下简洁的方式进行计数操作:
let arr = ["FOO", "FOO", "BAR", "FOOBAR"]
var counts: [String: Int] = [:]
arr.forEach { counts[$0, default: 0] += 1 }
print(counts) // "["FOOBAR": 1, "FOO": 2, "BAR": 1]"
Run Code Online (Sandbox Code Playgroud)
斯威夫特4: reduce(into:_:)
Swift 4引入了一个新版本,reduce
它使用一个inout
变量来累积结果.使用它,计数的创建真正成为一条线:
let arr = ["FOO", "FOO", "BAR", "FOOBAR"]
let counts = arr.reduce(into: [:]) { counts, word in counts[word, default: 0] += 1 }
print(counts) // ["BAR": 1, "FOOBAR": 1, "FOO": 2]
Run Code Online (Sandbox Code Playgroud)
或者使用默认参数:
let counts = arr.reduce(into: [:]) { $0[$1, default: 0] += 1 }
Run Code Online (Sandbox Code Playgroud)
最后,您可以将其作为扩展,Array
以便可以在包含Hashable
项目的任何数组上调用它:
extension Array where Element: Hashable {
var histogram: [Element: Int] {
return self.reduce(into: [:]) { counts, elem in counts[elem, default: 0] += 1 }
}
}
Run Code Online (Sandbox Code Playgroud)
这个想法是从这个问题借来的,虽然我把它改成了计算属性.
Rub*_*ben 81
array.filter{$0 == element}.count
Run Code Online (Sandbox Code Playgroud)
Ima*_*tit 25
使用Swift 4,您可以根据需要选择以下6个Playground代码中的一个来计算阵列中可出售物品的出现次数.
Array
reduce(into:_:)
和Dictionary
subscript(_:default:)
(需要Swift 4)let array = [4, 23, 97, 97, 97, 23]
let dictionary = array.reduce(into: [:]) { counts, number in
counts[number, default: 0] += 1
}
print(dictionary) // [4: 1, 23: 2, 97: 3]
Run Code Online (Sandbox Code Playgroud)
repeatElement(_:count:)
函数,zip(_:_:)
函数,Dictionary
init(_:uniquingKeysWith:)
初始化器和返回Dictionary
(需要Swift 4)let array = [4, 23, 97, 97, 97, 23]
let repeated = repeatElement(1, count: array.count)
//let repeated = Array(repeating: 1, count: array.count) // also works
let zipSequence = zip(array, repeated)
let dictionary = Dictionary(zipSequence, uniquingKeysWith: { (current, new) in
return current + new
})
//let dictionary = Dictionary(zipSequence, uniquingKeysWith: +) // also works
print(dictionary) // prints [4: 1, 23: 2, 97: 3]
Run Code Online (Sandbox Code Playgroud)
init(grouping:by:)
mapValues(_:)
初始化程序并返回Dictionary
元组(需要Swift 4)let array = [4, 23, 97, 97, 97, 23]
let dictionary = Dictionary(grouping: array, by: { $0 })
let newDictionary = dictionary.mapValues { (value: [Int]) in
return value.count
}
print(newDictionary) // prints: [97: 3, 23: 2, 4: 1]
Run Code Online (Sandbox Code Playgroud)
init(grouping:by:)
let array = [4, 23, 97, 97, 97, 23]
let dictionary = Dictionary(grouping: array, by: { $0 })
let newArray = dictionary.map { (key: Int, value: [Int]) in
return (key, value.count)
}
print(newArray) // prints: [(4, 1), (23, 2), (97, 3)]
Run Code Online (Sandbox Code Playgroud)
map(_:)
,Dictionary
方法和返回subscript(_:)
元组(需要基础)extension Array where Element: Hashable {
func countForElements() -> [Element: Int] {
var counts = [Element: Int]()
for element in self {
counts[element] = (counts[element] ?? 0) + 1
}
return counts
}
}
let array = [4, 23, 97, 97, 97, 23]
print(array.countForElements()) // prints [4: 1, 23: 2, 97: 3]
Run Code Online (Sandbox Code Playgroud)
NSCountedSet
,NSEnumerator
并返回一个map(_:)
元组(需要基金会)import Foundation
extension Array where Element: Hashable {
func countForElements() -> [(Element, Int)] {
let countedSet = NSCountedSet(array: self)
let res = countedSet.objectEnumerator().map { (object: Any) -> (Element, Int) in
return (object as! Element, countedSet.count(for: object))
}
return res
}
}
let array = [4, 23, 97, 97, 97, 23]
print(array.countForElements()) // prints [(97, 3), (4, 1), (23, 2)]
Run Code Online (Sandbox Code Playgroud)
积分:
我更新了oisdk对Swift2的回答.
16/04/14我将此代码更新为Swift2.2
16/10/11更新为Swift3
哈希的:
extension Sequence where Self.Iterator.Element: Hashable {
private typealias Element = Self.Iterator.Element
func freq() -> [Element: Int] {
return reduce([:]) { (accu: [Element: Int], element) in
var accu = accu
accu[element] = accu[element]?.advanced(by: 1) ?? 1
return accu
}
}
}
Run Code Online (Sandbox Code Playgroud)
Equatable:
extension Sequence where Self.Iterator.Element: Equatable {
private typealias Element = Self.Iterator.Element
func freqTuple() -> [(element: Element, count: Int)] {
let empty: [(Element, Int)] = []
return reduce(empty) { (accu: [(Element, Int)], element) in
var accu = accu
for (index, value) in accu.enumerated() {
if value.0 == element {
accu[index].1 += 1
return accu
}
}
return accu + [(element, 1)]
}
}
}
Run Code Online (Sandbox Code Playgroud)
用法
let arr = ["a", "a", "a", "a", "b", "b", "c"]
print(arr.freq()) // ["b": 2, "a": 4, "c": 1]
print(arr.freqTuple()) // [("a", 4), ("b", 2), ("c", 1)]
Run Code Online (Sandbox Code Playgroud)
for (k, v) in arr.freq() {
print("\(k) -> \(v) time(s)")
}
// b -> 2 time(s)
// a -> 4 time(s)
// c -> 1 time(s)
for (element, count) in arr.freqTuple() {
print("\(element) -> \(count) time(s)")
}
// a -> 4 time(s)
// b -> 2 time(s)
// c -> 1 time(s)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
43149 次 |
最近记录: |