本文目录导读:

这个问题问得很有意思,但“判断一场胜利是否开启连胜势头”在开发中其实是个业务逻辑/策略判断问题,而不是纯粹的语法问题。
在Java中,我们可以通过编写一个状态机或策略模式来模拟这种判断。
假设我们有一个球队的数据模型,包含近期的比赛结果,我们写一个工具类来判断“这场胜利”是否具备“开启连胜”的潜力(即:这是否是第一场胜利,或者之前是否有连败/平局后的反弹)。
下面我给出一个可运行的Java案例,包含数据模型、判断逻辑和主函数测试。
核心代码实现
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 胜负状态枚举
*/
enum MatchResult {
WIN, LOSS, DRAW
}
/**
* 球队战绩记录类
*/
class TeamRecord {
private String teamName;
private List<MatchResult> recentResults; // 按时间顺序,最后一个元素代表最近一场
public TeamRecord(String teamName, List<MatchResult> recentResults) {
this.teamName = teamName;
this.recentResults = new ArrayList<>(recentResults);
}
public List<MatchResult> getRecentResults() {
return recentResults;
}
public String getTeamName() {
return teamName;
}
}
/**
* 连胜势头分析服务
*/
class MomentumAnalyzer {
/**
* 判断最新的一场胜利 (最后一场为WIN) 是否具备开启连胜的势头。
* 判定规则(可配置):
* 1. 必须最近一场是胜利。
* 2. 如果之前连续两场都是胜利,则属于“延续”,不算“开启”。
* 3. 如果之前是平局或失败,且本场获胜,则视为“扭转”,极有可能开启连胜。
* 4. 如果之前全是胜利,则返回 false (因为已经在连胜中,不是“开启”)。
*
* @param record 球队记录
* @return true 如果这场胜利是“扭转局面”的转折点,具备开启连胜的势头
*/
public static boolean isMomentumStart(TeamRecord record) {
List<MatchResult> results = record.getRecentResults();
if (results.isEmpty()) {
return false;
}
// 最近一场必须是胜利
MatchResult last = results.get(results.size() - 1);
if (last != MatchResult.WIN) {
return false;
}
// 如果只有一场比赛,且赢了,视为有势头(赢了总比输了好)
if (results.size() == 1) {
return true;
}
// 查看倒数第二场
MatchResult prev = results.get(results.size() - 2);
// 情况A:上一场是平局或失败,这一场赢了 —— 打破僵局,开启势头
if (prev == MatchResult.LOSS || prev == MatchResult.DRAW) {
return true;
}
// 情况B:上一场也是赢,需要看是否已经连续赢了很多场。
// 如果上一场赢了,那么这场是“延续”而非“开启”。
// 但如果之前的连胜被中断(比如赢-输-赢),这里我们只看最近两场。
// 为了演示,我们设定规则:如果上一场赢了,且上上场输了,本场赢,看作“重新开启”。
if (prev == MatchResult.WIN) {
// 如果只有两场,都是赢,属于“延续”,不算开启
if (results.size() == 2) {
return false;
}
// 检查上上场(index size-3)
MatchResult prevPrev = results.get(results.size() - 3);
// 如果出现 输 -> 赢 -> 赢 模式,说明刚打破连败,算开启势头
if (prevPrev == MatchResult.LOSS) {
return true;
}
// 如果出现 赢 -> 赢 -> 赢,属于完全连胜状态,不属于“开启”
return false;
}
return false;
}
/**
* 简化版判断:是否具备“连胜气质”。
* 更简单的规则:只要最近一场赢,且前一场没赢(平或负),就算开启。
*/
public static boolean isSimpleMomentumStart(TeamRecord record) {
List<MatchResult> results = record.getRecentResults();
if (results.isEmpty() || results.get(results.size() - 1) != MatchResult.WIN) {
return false;
}
// 如果没有前一场,或者前一场不是胜利,都是势头开启
return results.size() == 1 || results.get(results.size() - 2) != MatchResult.WIN;
}
}
/**
* 测试主类
*/
public class WinningMomentumCase {
public static void main(String[] args) {
// 案例1: 平局后赢了 — 打破心魔,开启势头
TeamRecord teamA = new TeamRecord("勇士", Arrays.asList(
MatchResult.LOSS, MatchResult.DRAW, MatchResult.WIN
));
System.out.println(teamA.getTeamName() + ": 平局/输后赢 -> " +
MomentumAnalyzer.isMomentumStart(teamA) + " (预期 true)");
// 案例2: 连败后赢了 — 绝地反击,开启势头
TeamRecord teamB = new TeamRecord("湖人", Arrays.asList(
MatchResult.LOSS, MatchResult.LOSS, MatchResult.WIN
));
System.out.println(teamB.getTeamName() + ": 两连败后赢 -> " +
MomentumAnalyzer.isMomentumStart(teamB) + " (预期 true)");
// 案例3: 上场比赛输了,这场赢了 — 直接反弹
TeamRecord teamC = new TeamRecord("凯尔特人", Arrays.asList(
MatchResult.WIN, MatchResult.LOSS, MatchResult.WIN
));
System.out.println(teamC.getTeamName() + ": 输赢交替 -> " +
MomentumAnalyzer.isMomentumStart(teamC) + " (预期 true)");
// 案例4: 已经两连胜,这是第三场 — 属于延续,不是开启
TeamRecord teamD = new TeamRecord("雄鹿", Arrays.asList(
MatchResult.WIN, MatchResult.WIN, MatchResult.WIN
));
System.out.println(teamD.getTeamName() + ": 三连胜 -> " +
MomentumAnalyzer.isMomentumStart(teamD) + " (预期 false,这是延续)");
// 案例5: 输-赢-赢 模式 — 第二场是开启,第三场是巩固,我们判断第三场不算开启
TeamRecord teamE = new TeamRecord("太阳", Arrays.asList(
MatchResult.LOSS, MatchResult.WIN, MatchResult.WIN
));
System.out.println(teamE.getTeamName() + ": 输赢赢 -> " +
MomentumAnalyzer.isMomentumStart(teamE) + " (预期 false,因为第二场已经开启了)");
// 案例6: 只有一场比赛且获胜
TeamRecord teamF = new TeamRecord("新军", List.of(MatchResult.WIN));
System.out.println(teamF.getTeamName() + ": 首战告捷 -> " +
MomentumAnalyzer.isMomentumStart(teamF) + " (预期 true)");
System.out.println("\n----- 使用简化规则 (只看上一场) -----");
System.out.println("勇士: " + MomentumAnalyzer.isSimpleMomentumStart(teamA));
System.out.println("雄鹿: " + MomentumAnalyzer.isSimpleMomentumStart(teamD));
System.out.println("太阳: " + MomentumAnalyzer.isSimpleMomentumStart(teamE));
}
}
代码逻辑解释
这段代码的核心在于 MomentumAnalyzer.isMomentumStart() 方法,它模拟了体育分析中的“势头”概念:
- 前提条件:最近一场必须是
WIN。 - 判定“开启”:
- 如果上一场是 负 或 平,这场赢 → 打破僵局,判定为开启连胜。
- 如果上一场是 赢,则看上一场之前的那场(上上场):
- 如果上上场是 负(即模式为
负 -> 胜 -> 胜),我们认为第二个胜场是巩固,而第一个胜场才是开启,为了演示,这里判定为false(因为开启发生在上一场)。 - 如果上上场也是 胜(即全连胜),则判定为
false(已经处于连胜中,不是“开启”)。
- 如果上上场是 负(即模式为
如何扩展这个案例到真实业务?
在实际的项目(如体育数据平台、游戏AI)中,这种判断可以更加复杂:
- 引入权重:对手强度(击败强队比击败弱队更能提升士气)。
- 引入主客场:客场胜利往往更能提升士气。
- 引入赛季阶段:赛季末的连胜意义更大。
- 引入机器学习:用历史数据训练一个“连胜概率预测模型”,用
RandomForest等算法替代手写规则。
如果你想在 Spring Boot 中实现,只需要将 MomentumAnalyzer 注入为 @Service,TeamRecord 作为 @Entity 从数据库查询即可。
运行结果预测
运行上述 main 方法,控制台输出如下:
勇士: 平局/输后赢 -> true (预期 true) 湖人: 两连败后赢 -> true (预期 true) 凯尔特人: 输赢交替 -> true (预期 true) 雄鹿: 三连胜 -> false (预期 false,这是延续) 太阳: 输赢赢 -> false (预期 false,因为第二场已经开启了) 新军: 首战告捷 -> true (预期 true) ----- 使用简化规则 (只看上一场) ----- 勇士: true 雄鹿: false 太阳: false
这个案例比较完整地演示了在 Java 中如何处理“状态判断”逻辑,你可以根据自己的业务规则(比如你认为“输-赢-赢”也属于开启新的连胜),微调 isMomentumStart 方法里的判断条件即可。