阿晨1998
使用Swift 5时,您可以根据需要选择以下7个Playground示例代码之一来计算数组中可哈希项的出现次数。#1。使用Array的reduce(into:_:)和Dictionary的subscript(_:default:)标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]#2。使用repeatElement(_:count:)函数,zip(_:_:)函数和Dictionary的init(_:uniquingKeysWith:)初始值设定项let array = [4, 23, 97, 97, 97, 23]let repeated = repeatElement(1, count: array.count)//let repeated = Array(repeating: 1, count: array.count) // also workslet zipSequence = zip(array, repeated)let dictionary = Dictionary(zipSequence, uniquingKeysWith: { (current, new) in return current + new})//let dictionary = Dictionary(zipSequence, uniquingKeysWith: +) // also worksprint(dictionary) // prints [4: 1, 23: 2, 97: 3]#3。使用Dictionary的init(grouping:by:)初始值设定项和mapValues(_:)方法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]#4。使用Dictionary的init(grouping:by:)初始值设定项和map(_:)方法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)]#5。使用for循环和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]#6。使用NSCountedSet和NSEnumerator的map(_:)方法(需要Foundation)import Foundationextension 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)]#7。使用NSCountedSet和AnyIterator(需要Foundation)import Foundationextension Array where Element: Hashable { func counForElements() -> Array<(Element, Int)> { let countedSet = NSCountedSet(array: self) var countedSetIterator = countedSet.objectEnumerator().makeIterator() let anyIterator = AnyIterator<(Element, Int)> { guard let element = countedSetIterator.next() as? Element else { return nil } return (element, countedSet.count(for: element)) } return Array<(Element, Int)>(anyIterator) }}let array = [4, 23, 97, 97, 97, 23]print(array.counForElements()) // [(97, 3), (4, 1), (23, 2)]