gpt4 book ai didi

ios - Swift 中数组的直方图

转载 作者:搜寻专家 更新时间:2023-10-31 21:58:51 24 4
gpt4 key购买 nike

我正在尝试编写一个在 Array 上运行的通用直方图函数,但我遇到了困难,因为 Type 'Element' 不符合协议(protocol) 'Hashable'.

extension Array {
func histogram() -> [Array.Element: Int] {
return self.reduce([Array.Element: Int]()) { (acc, key) in
let value = (acc[key] == nil) ? 1 : (acc[key]! + 1)
return acc.dictionaryByUpdatingKey(key: key, value: value)
}
}
}

其中 dictionaryByUpdatingKey(...) 改变现有字典如下:

extension Dictionary {
func dictionaryByUpdatingKey(key: Dictionary.Key, value: Dictionary.Value) -> Dictionary {
var mutableSelf = self
let _ = mutableSelf.updateValue(value, forKey: key)
return mutableSelf
}
}

我尝试用 AnyHashable 替换 Array.Element,然后强制 key as! AnyHashable,但这看起来很困惑,返回类型最好与 Array.Element 相同,而不是 AnyHashable

我希望按如下方式使用 Array 扩展:

let names = ["Alex", "Alex", "James"]
print(names.histogram()) // ["James": 1, "Alex": 2]

let numbers = [2.0, 2.0, 3.0]
print(numbers.histogram()) // [3.0: 1, 2.0: 2]

最佳答案

通用 where 子句:where Element: Hashable 添加到您的扩展中:

extension Sequence where Element: Hashable {
func histogram() -> [Element: Int] {
return self.reduce([Element: Int]()) { (acc, key) in
let value = acc[key, default: 0] + 1
return acc.dictionaryByUpdatingKey(key: key, value: value)
}
}
}

我还采纳了@MartinR 的建议,即使用新的 default 值进行字典查找。


使用 reduce(into:_:)你可以更简单有效地做到这一点:

extension Sequence where Element: Hashable {
func histogram() -> [Element: Int] {
return self.reduce(into: [:]) { counts, elem in counts[elem, default: 0] += 1 }
}
}

关于ios - Swift 中数组的直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49979152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com