java案例认为这场胜利是否开启连胜势头?

wen java案例 2

本文目录导读:

java案例认为这场胜利是否开启连胜势头?

  1. 核心代码实现
  2. 代码逻辑解释
  3. 如何扩展这个案例到真实业务?
  4. 运行结果预测

这个问题问得很有意思,但“判断一场胜利是否开启连胜势头”在开发中其实是个业务逻辑/策略判断问题,而不是纯粹的语法问题。

在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() 方法,它模拟了体育分析中的“势头”概念:

  1. 前提条件:最近一场必须是 WIN
  2. 判定“开启”
    • 如果上一场是 ,这场赢 → 打破僵局,判定为开启连胜。
    • 如果上一场是 ,则看上一场之前的那场(上上场):
      • 如果上上场是 (即模式为 负 -> 胜 -> 胜),我们认为第二个胜场是巩固,而第一个胜场才是开启,为了演示,这里判定为 false(因为开启发生在上一场)。
      • 如果上上场也是 (即全连胜),则判定为 false(已经处于连胜中,不是“开启”)。

如何扩展这个案例到真实业务?

在实际的项目(如体育数据平台、游戏AI)中,这种判断可以更加复杂:

  • 引入权重:对手强度(击败强队比击败弱队更能提升士气)。
  • 引入主客场:客场胜利往往更能提升士气。
  • 引入赛季阶段:赛季末的连胜意义更大。
  • 引入机器学习:用历史数据训练一个“连胜概率预测模型”,用 RandomForest 等算法替代手写规则。

如果你想在 Spring Boot 中实现,只需要将 MomentumAnalyzer 注入为 @ServiceTeamRecord 作为 @Entity 从数据库查询即可。


运行结果预测

运行上述 main 方法,控制台输出如下:

勇士: 平局/输后赢 -> true (预期 true)
湖人: 两连败后赢 -> true (预期 true)
凯尔特人: 输赢交替 -> true (预期 true)
雄鹿: 三连胜 -> false (预期 false,这是延续)
太阳: 输赢赢 -> false (预期 false,因为第二场已经开启了)
新军: 首战告捷 -> true (预期 true)
----- 使用简化规则 (只看上一场) -----
勇士: true
雄鹿: false
太阳: false

这个案例比较完整地演示了在 Java 中如何处理“状态判断”逻辑,你可以根据自己的业务规则(比如你认为“输-赢-赢”也属于开启新的连胜),微调 isMomentumStart 方法里的判断条件即可。

抱歉,评论功能暂时关闭!