- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想计算胜利的次数并将所有分数相加。
我愿意使用平面 map 和减少,以降低复杂性。为了安全起见,我可以使用 for 循环来获取它
问题是在 allMatch 中,我可以有不同的 teamID(团队可以单人或多人比赛)并且与顺序无关(例如 teamID 1,2 等于 teamID 2,1
struct InfoMatch: Hashable {
let teamId: Set<Int>
let rank: Int
let mPoints: Int
let vPoints: Int
}
所有比赛都是数组的数组,因为它返回每场比赛每支球队的信息,在本例中,第一场比赛有 2 支球队,最后一场比赛有 3 支球队
let allMatch: [[InfoMatch]] = [
[InfoMatch(teamId:[1,2],rank:1,mPoints: 200,vPoints: 0),InfoMatch(teamId:[3,4],rank:2,mPoints: 100,vPoints: 0)],
[InfoMatch(teamId:[1,2],rank:2,mPoints: 0,vPoints: 10),InfoMatch(teamId:[4,3],rank:1,mPoints: 0,vPoints: 20)],
[InfoMatch(teamId:[2,1],rank:1,mPoints: 40,vPoints: 0),InfoMatch(teamId:[3,4],rank:2,mPoints: 30,vPoints: 0),InfoMatch(teamId:[5,6],rank:3,mPoints: 5,vPoints: 0)]
]
let winners = allMatch.map{$0.filter{$0.rank == 1}}
let losers = allMatch.map{$0.filter{$0.rank != 1}}
print(winners)
打印:
[[__lldb_expr_7.InfoMatch(teamId: Set([1, 2]), rank: 1, mPoints: 200, vPoints: 0)], [__lldb_expr_7.InfoMatch(teamId: Set([3, 4]), rank: 1, mPoints: 0, vPoints: 20)], [__lldb_expr_7.InfoMatch(teamId: Set([1, 2]), rank: 1, mPoints: 40, vPoints: 0)]]
我想要一个返回的数组
teamID: victoryCount: loserCount: mPoints: vPoints:
举个例子:
teamID:1,2 victoryCount:2 loserCount:1 mPoints:240 vPoints:10 teamID:3,4 victoryCount:1 loserCount:2 mPoints:130 vPoints:20 teamID:5,6 victoryCount:0 loserCount:1 mPoints:5 vPoints:0
最佳答案
我真的想知道使用flatmap映射和reduce是否可以降低复杂性,但是你可以这样使用reduce
。
首先,你说你想要teamID:victoryCount:loserCount:mPoints:vPoints:,那么你应该更好地定义代表它的类型:
struct MatchStats {
var teamID: Set<Int>
var victoryCount: Int
var loserCount: Int
var mPoints: Int
var vPoints: Int
}
//For convenience...
extension MatchStats {
init(teamID: Set<Int>) {
self.teamID = teamID
victoryCount = 0
loserCount = 0
mPoints = 0
vPoints = 0
}
}
//For debugging...
extension MatchStats: CustomStringConvertible {
public var description: String {
let teamIDStr = teamID.sorted().map(String.init).joined(separator: ",")
return "teamID:\(teamIDStr) victoryCount:\(victoryCount) loserCount:\(loserCount) mPoints:\(mPoints) vPoints:\(vPoints)"
}
}
并在 reduce
和 flatMap
中按如下方式使用它:
let teamStats: [Set<Int>: MatchStats] = allMatch.flatMap{$0}.reduce(into: [:]) {result, info in
result[info.teamId, default: MatchStats(teamID: info.teamId)].victoryCount += info.rank == 1 ? 1 : 0
result[info.teamId]!.loserCount += info.rank == 1 ? 0 : 1
result[info.teamId]!.mPoints += info.mPoints
result[info.teamId]!.vPoints += info.vPoints
}
print(teamStats.values)
输出:
[teamID:1,2 victoryCount:2 loserCount:1 mPoints:240 vPoints:10, teamID:3,4 victoryCount:1 loserCount:2 mPoints:130 vPoints:20, teamID:5,6 victoryCount:0 loserCount:1 mPoints:5 vPoints:0]
(每次调用时输出可能是随机顺序的。但排序是另一个问题。)
<小时/>你认为使用reduce
比这更好吗?
var teamStats: [Set<Int>: MatchStats] = [:]
for match in allMatch {
for info in match {
teamStats[info.teamId, default: MatchStats(teamID: info.teamId)].victoryCount += info.rank == 1 ? 1 : 0
teamStats[info.teamId]!.loserCount += info.rank == 1 ? 0 : 1
teamStats[info.teamId]!.mPoints += info.mPoints
teamStats[info.teamId]!.vPoints += info.vPoints
}
}
print(teamStats.values)
关于ios - 使用条件排名数组进行快速归约和求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56609689/
我有一个需要映射/缩减的文件,其中输出需要总和和日期的最大值。我有总和部分的工作,但是,我不确定如何将最大日期作为减少的输出的一部分。 输入数据如下所示: ID1, ID2, date,
我必须为 C 的一个子集构建一个编译器。显然,因为这是我第一次做这样的事情,所以进展得不是很好。然而。我目前正在尝试为所述子集构建词法分析器和解析器。 我决定逐步构建它,并在出现错误时进行修复。所以我
我听说过很多关于 Map/Reduce 的内容,尤其是在 Google 大规模并行计算系统的背景下。到底是什么? 最佳答案 来自 Google 的摘要 MapReduce研究发表页面: MapRedu
我正在使用 JavaScript 原生 reduce,但是我想稍微改变分组以获得我想要的结果。我有一个数组如下: const people = [ {name: "John", age: 23,
我试图让一个简单的 map reduce 在 MongoVUE 中工作,但它没有返回任何结果,我只是想让它输出每个 userID 的计数,这样我就可以有一个工作示例来构建。 function Map(
我可能错了,但我见过的所有(?)Apache Hadoop 示例都将存储在本地文件系统上的文件作为输入(例如 org.apache.hadoop.examples.Grep) 有没有办法在 Hadoo
如何在 Swift 4 中以更优雅的方式完成类似以下的事情,例如使用 map 和/或 reduce。 为了在此处发布,我简化了代码,但请注意它确实需要使用索引。 var numbers = [50,
我是一名优秀的程序员,十分优秀!