问题描述
最高的2个数字的总和
最高的 3 个数字的总和
这些总数将用于应用程序中的其他计算。
应注意以下内容,因为可以有 1 个以上的数字具有相同的值,但只有相关数字需要包含在总数中。以下是所需内容的示例:
两个最高值
如果回报是 3,3,2,1 那么回报应该是 6 (3 + 3)
如果回报是 3,2 那么回报应该是 6 (3 + 3)
如果回报是 4,1 那么回报应该是 7 (4 + 3)
三个最高值
如果回报是 3,2 那么回报应该是 8 (3 + 3 + 2)
如果回报是 4,3 那么回报应该是 10 (4 + 3 + 3)
如果回报是 3,3 那么回报应该是 9 (3 + 3 + 3)
我查看了大量搜索如下:-
-
能够对返回的 4 个值应用排名,以便使用该排名返回最高的 2 或 3 个值,但找不到 SwiftUI 的任何代码来实现这一点。
-
我可以为每个值使用多个嵌套的 if 函数来将值与其他值进行比较并确定最高的 2 或 3 个值,但这将需要大量代码来实现相对简单的计算,例如excel。
SwiftUI 中是否有任何“标准”功能可以让我实现他的目标,或者 3 的冗长方法是唯一可以实现的方法?
希望有意义吗?
func p1h1points(hole1par: Int16,hole1index: Int16) -> Int16 {
let gross = p1hole1gross
let par = hole1par
let shot = p1h1shots(hole1index: hole1index)
let net = Int16(gross) - Int16(shot)
let points = par - net
if p1hole1gross == 0 {
return 0
}
if points < -1 {
return 0
}
if points == -1 {
return 1
}
if points == 0 {
return 2
}
if points == 1 {
return 3
}
if points == 2 {
return 4
}
if points == 3 {
return 5
}
if points == 4 {
return 6
}
if points == 5 {
return 7
}
if points == 6 {
return 8
}
if points == 7 {
return 9
}
return 0
}
func p2h1points(hole1par: Int16,hole1index: Int16) -> Int16 {
let gross = p2hole1gross
let par = hole1par
let shot = p2h1shots(hole1index: hole1index)
let net = Int16(gross) - Int16(shot)
let points = par - net
if p2hole1gross == 0 {
return 0
}
if points < -1 {
return 0
}
if points == -1 {
return 1
}
if points == 0 {
return 2
}
if points == 1 {
return 3
}
if points == 2 {
return 4
}
if points == 3 {
return 5
}
if points == 4 {
return 6
}
if points == 5 {
return 7
}
if points == 6 {
return 8
}
if points == 7 {
return 9
}
return 0
}
func p3h1points(hole1par: Int16,hole1index: Int16) -> Int16 {
let gross = p3hole1gross
let par = hole1par
let shot = p3h1shots(hole1index: hole1index)
let net = Int16(gross) - Int16(shot)
let points = par - net
if p3hole1gross == 0 {
return 0
}
if points < -1 {
return 0
}
if points == -1 {
return 1
}
if points == 0 {
return 2
}
if points == 1 {
return 3
}
if points == 2 {
return 4
}
if points == 3 {
return 5
}
if points == 4 {
return 6
}
if points == 5 {
return 7
}
if points == 6 {
return 8
}
if points == 7 {
return 9
}
return 0
}
func p4h1points(hole1par: Int16,hole1index: Int16) -> Int16 {
let gross = p4hole1gross
let par = hole1par
let shot = p4h1shots(hole1index: hole1index)
let net = Int16(gross) - Int16(shot)
let points = par - net
if p4hole1gross == 0 {
return 0
}
if points < -1 {
return 0
}
if points == -1 {
return 1
}
if points == 0 {
return 2
}
if points == 1 {
return 3
}
if points == 2 {
return 4
}
if points == 3 {
return 5
}
if points == 4 {
return 6
}
if points == 5 {
return 7
}
if points == 6 {
return 8
}
if points == 7 {
return 9
}
return 0
}
解决方法
假设你有一个数字数组,我会这样做
let highestNumbersToAdd = 2
arrayWithPoints.sort
let total = arrayWithPoints[...highestNumbersToAdd].reduce(0,+)
,
在实现这样的新功能时,将其放入新的自定义类型通常是个好主意,这样该类型只负责这个新部分,而旧代码不会因更多责任而变得混乱。
此外,如果需要,这将使更改逻辑或扩展逻辑变得更容易。
这里有一个用于计算点的结构,您可以从现有代码中使用
struct PointsCalculator {
private var playerPoints: [Int]
init(points: [Int]) {
playerPoints = points
}
var sum2Highest: Int {
sum(for: 2)
}
var sum3Highest: Int {
sum(for: 3)
}
private func sum(for count: Int) -> Int {
playerPoints.sorted().suffix(count).reduce(0,+)
}
}
这将所有玩家的点数作为一个数组,如果同时计算每个玩家的点数,效果会很好。如果另一方面,单独计算点,那么下面的函数可能更合适
extension PointsCalculator {
init() {
playerPoints = Array(repeating: 0,count: 4)
}
mutating func add(_ points: Int,player: Int) {
guard 1...4 ~= player else {
fatalError("Player must be between 1 and 4")
}
playerPoints[player-1] = points
}
}