You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java乒乓球计分程序同分场景下冠亚军正确输出方法

问题原因

原排名逻辑有三个致命问题:

  • 第一轮遍历只记录了冠军、亚军的积分数值,没有同步绑定对应的选手编号,后续单独遍历匹配编号时很容易错位
  • 冠军编号匹配逻辑是遍历到积分相等的选手就覆盖原有编号,从1号到5号遍历完,最后留下的是编号最大的同分选手,和你要求的「同分时编号小的选手排前面」规则完全相反
  • 亚军编号的判断条件写为runnerupPlayer <= winnerPlayer,这个条件恒成立(亚军积分必然小于等于冠军积分),遍历到最后一个选手时会直接把亚军编号设为最后一位选手的编号,自然会出现冠亚军都是同一个人的错误。
修改方法

不要分开做「找最高/次高积分」和「匹配选手编号」两步,直接在一次遍历里同时追踪冠亚军的积分和对应编号,同分时严格保留先遍历到的小编号选手作为更高位排名,从根源避免编号和积分错位。
直接删除原来的两段排名循环代码,替换为以下内容:

// 初始化冠亚军的积分、编号,初始积分设为不可能的最小值-1
int winnerScore = -1, winnerId = 0;
int runnerupScore = -1, runnerupId = 0;

for (int i = 0; i < 5; i++) {
    int currentScore = sumPlayer[i];
    int currentId = i + 1;

    if (currentScore > winnerScore) {
        // 当前选手积分超过现有冠军:原冠军降为亚军,当前选手成为新冠军
        runnerupScore = winnerScore;
        runnerupId = winnerId;
        winnerScore = currentScore;
        winnerId = currentId;
    } else if (currentScore == winnerScore) {
        // 积分和冠军持平,因为按编号从小到大遍历,小编号选手已经占了冠军位,当前同分选手直接判断是否更新为亚军
        if (currentScore > runnerupScore) {
            runnerupScore = currentScore;
            runnerupId = currentId;
        }
    } else if (currentScore > runnerupScore) {
        // 积分没超过冠军,但超过现有亚军,更新为亚军
        runnerupScore = currentScore;
        runnerupId = currentId;
    }
}

最后把输出语句的变量替换为新追踪的变量即可:

System.out.println("\nWinner: Player " + winnerId + " by winning " + winnerScore + " win sets.");
System.out.println("Runner-up: Player " + runnerupId + " by winning " + runnerupScore + " win sets.");

修改后当1号和5号同积4分时,会按遍历顺序先把1号记为冠军,后续5号同分不会覆盖冠军位,只会被记为亚军,完全符合你预期的输出结果。

额外逻辑提示

你当前代码里的胜场判定逻辑存在漏洞:现在的判断是只要选手得分大于0就给胜场分,实际应该对比对阵双方的得分,得分更高的一方才能获得胜场,否则会出现双方都有得分时两边都算胜场的错误。

内容的提问来源于stack exchange,提问作者Aliff Mahyuddin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 01:54:34