arrays - 将对象数组转换为累积字典 Swift
问题描述
我有一个叫做的结构person
struct person{
var name : String
var score: Int
}
然后我创建一个名为
let people : [person] = [person("a", 1), person("a", 3), person("b", 5)]
如您所见,这里有两个同名“a”的对象。
现在我想把这个变成一个累积字典,显示每个人的总分。在这种情况下
dict = {"a": 4 (3+1), "b": 5}
我知道我违反了 OO 设计规则。谢谢
解决方案
这里有一个基本的建模问题。您的结构person
实际上并没有为人建模。它模拟类似RoundResult
.
我将通过制作一个Player
真正模拟一个人的 a 来重构它(只有类似 的字段name: String
),并制作一个RoundResult
包含 awinner: Player
和 a 的 a score: Score
。
struct Player: Hashable { // Perhaps should be a class, if names aren't unique.
let name: String
}
struct RoundResult {
let winner: Player
let score: Int
}
let playerA = Player(name: "a")
let playerB = Player(name: "b")
let roundResults = [
RoundResult(winner: playerA, score: 1),
RoundResult(winner: playerA, score: 3),
RoundResult(winner: playerB, score: 5),
]
let scoresByPlayer = Dictionary(grouping: roundResults, by: \.winner)
.mapValues { roundResults -> Int in
let scores = roundResults.lazy.map(\.score)
return scores.reduce(0, +)
}
print(scoresByPlayer)
从这里,您可以score
在球员上添加一个变量,该变量实际上模拟球员得分,而不仅仅是单轮/比赛/比赛/任何事情中的一小部分
推荐阅读
- c++ - 在 C++ 中使用派生类型覆盖成员函数
- php - 雄辩的只获得第一个主动查询
- python-3.x - python multiprocessing - 未使用预期参数调用的方法
- android - 如何在我的 android 应用程序源代码的特定页面上获取 webview(加载 url)?
- javascript - 如何在 JavaScript 中检查图像中是否存在颜色
- kentico - Kentico 12 Azure 搜索
- c++ - 构建 MRPT 库时 cmake 配置失败
- windows - 将特定文件添加到 Windows 路径
- javascript - 在多维数组Javascript中使用地图
- c# - 向 dotnet core 3 注册 Open Generic