swift - 来自多个值的唯一数组
问题描述
我有一个具有这种结构的对象数组:
struct Message {
let name: String
let fromNumber: String
let toNumber: String
}
let array = [Message(name: "John", fromNumber: "123456789", toNumber: "987654321")
,Message(name: "John", fromNumber: "987654321", toNumber: "123456789")
,Message(name: "Smith", fromNumber: "11223344", toNumber: "987654321")
,Message(name: "Smith", fromNumber: "987654321", toNumber: "11223344")]
如何对它们进行分组并获得具有唯一值的数组?请注意,name
属性不是唯一的。
结果应该是:
[Message(name: "John", fromNumber: "123456789", toNumber: "987654321"),
Message(name: "Smith", fromNumber: "11223344", toNumber: "987654321")]
解决方案
我的理解是,可能会返回具有相同名称和数字组合的任何消息,因此对于此解决方案,我正在使用Set
and Hashable
。
首先使结构符合Hashable
我们将两个数字属性作为一个比较的方式。
extension Message: Hashable {
static func == (lhs: Message, rhs: Message) -> Bool {
return lhs.name == rhs.name &&
Set(arrayLiteral: lhs.fromNumber, lhs.toNumber) == Set(arrayLiteral: rhs.fromNumber, rhs.toNumber)
}
func hash(into hasher: inout Hasher) {
hasher.combine(name)
hasher.combine(Set(arrayLiteral: fromNumber, toNumber))
}
}
然后使用熟悉的解决方案将数组转换为集合,然后再转换回数组
let unique = Array(Set(array))
推荐阅读
- javascript - 使用 jsZIP 下载多个 pdfmake 文件
- nginx - 无法启动高性能 Web 服务器和反向代理服务器
- reactive-programming - 从 ServerWebExchange Spring 云网关读取请求正文
- python - 如何从数据流管道中的 PubSub 子目录中读取
- node.js - 在 Heroku Nodemon 上部署时未安装
- java - 无法在 Android 应用程序中使用形态指纹扫描仪设备捕获指纹
- python-3.x - 如何将列条目从日期转换为二进制(0 或 1)?
- python - 如何将变量从 PHP 传递到 Python 并返回?
- python - 安装 JupyterLab 时出现 Build Wheel 错误
- karate - 空手道框架:在运行加特林测试时,我们可以配置获取黄瓜报告吗