我正在开发一个名为TennisGameStatus的scala函数,它返回两个球员之间网球比赛的状态。提醒大家,这里是网球比赛的规则:
- 1st gain: 15 pts
- 2nd gain: 30 pts
- 3rd gain: 40 pts如果两名球员都得到40分,那么有很多州:
- "DEUCE" if both are equal to the same score
- "ADVANTAGE" is attributed to the player who wins **ONE** additional point to the 40 scores.
- "WIN" is attributed to the player who wins **TWO** times after the 40 scores.结果应该是这样:

因此,我开发了这个函数:
def TennisGameStatus(nameP1 : String, nameP2: String, wins: Array[String]): String = {
var scoreP1 = wins.count(x => x == nameP1)
var scoreP2 = wins.count(x => x == nameP2)
var Etat40P1 = wins.count(x => x == nameP1) >= 3
var Etat40P2 = wins.count(x => x == nameP2) >= 3
val valeursS40 = (5, 6)
if (scoreP1 > scoreP2 && (1 <= (wins.length) ) && ((wins.length) < 3)) {
return nameP1.concat((scoreP1 * 15).toString).concat(" ").concat(nameP2.concat((scoreP2 * 15).toString));
}
else if (scoreP2 > scoreP1 && (1 <= (wins.length) ) && ((wins.length) < 3)) {
return nameP2.concat((scoreP2 * 15).toString).concat(" ").concat(nameP1.concat((scoreP1 * 15).toString));
}
else if (scoreP1 == scoreP2) {
scoreP1 match {
case 0
=> return nameP1.concat((scoreP1 * 15).toString).concat(" ").concat(nameP2.concat((scoreP2 * 15).toString));
case 1
=> return "15a";
case 2
=> return "30a";
case 3
=> return "DEUCE";
}
}
else if (scoreP1 > scoreP2 && valeursS40.canEqual(scoreP1) && Etat40P1.equals(true) && Etat40P2.equals(true)) {
scoreP1 match {
case 5
=> return nameP1.concat("ADVANTAGDE");
case 6
=> return nameP1.concat("WIN");
}
}
else if (scoreP2 > scoreP1 && valeursS40.canEqual(scoreP2) && Etat40P1.equals(true) && Etat40P2.equals(true)) {
scoreP2 match {
case 5
=> return nameP2.concat("ADVANTAGDE");
case 6
=> return nameP2.concat("WIN");
}
}
else
return ""
}但是我认为我的函数没有被优化,它不包括scala提供的函数操作。有什么帮助吗?
发布于 2022-01-24 02:25:58
你是对的。这不是惯用的Scala代码,原因很多。
;。把他们移走。return关键字。把他们移走。不需要它们。var变量。您的score和Etat变量是初始化的,从未更改过,因此它们应该是vals。但真正的问题是代码不起作用。我遇到过许多无法产生正确或任何输出的输入场景。
我认为问题的核心来自您正在测试的复杂和令人困惑的if条件。在我看来,通过使用多个、更小的if检查,流会更清晰、更完整。
这是对我有用的东西。
// pseudo-code \\
if (top_win_count < 4)
if (difference_between_wins == 0)
compose "all" string
else
compose "player1 score - player2 score" string
else if (wins_diff > 1)
compose WINS string
else if (wins_diff > 0)
compose ADVANTAGE string
else
"DEUCE"整个方法可以用少于20行的代码编写。
https://codereview.stackexchange.com/questions/273262
复制相似问题