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
相关产品推荐
相关产品推荐

