Java 案例:计算主队胜率
下面给你一个完整的 Java 示例,演示如何从比赛数据中统计主队胜率。

完整代码示例
import java.util.*;
public class HomeWinRate {
// 比赛结果枚举
enum Result { HOME_WIN, DRAW, AWAY_WIN }
// 比赛记录
static class Match {
String homeTeam;
String awayTeam;
int homeGoals;
int awayGoals;
Match(String homeTeam, String awayTeam, int homeGoals, int awayGoals) {
this.homeTeam = homeTeam;
this.awayTeam = awayTeam;
this.homeGoals = homeGoals;
this.awayGoals = awayGoals;
}
Result getResult() {
if (homeGoals > awayGoals) return Result.HOME_WIN;
if (homeGoals < awayGoals) return Result.AWAY_WIN;
return Result.DRAW;
}
}
public static void main(String[] args) {
// 模拟一批比赛数据(可替换为数据库/文件/API)
List<Match> matches = Arrays.asList(
new Match("曼城", "利物浦", 2, 1), // 主胜
new Match("阿森纳", "切尔西", 1, 1), // 平
new Match("曼联", "热刺", 0, 2), // 客胜
new Match("曼城", "阿森纳", 3, 0), // 主胜
new Match("利物浦", "曼联", 2, 0), // 主胜
new Match("切尔西", "热刺", 1, 2), // 客胜
new Match("曼城", "切尔西", 1, 0), // 主胜
new Match("阿森纳", "利物浦", 2, 2), // 平
new Match("曼联", "曼城", 0, 3), // 客胜
new Match("热刺", "阿森纳", 1, 0) // 主胜
);
// 统计
long homeWins = 0, draws = 0, awayWins = 0;
for (Match m : matches) {
switch (m.getResult()) {
case HOME_WIN -> homeWins++;
case DRAW -> draws++;
case AWAY_WIN -> awayWins++;
}
}
int total = matches.size();
double homeRate = (double) homeWins / total * 100;
double drawRate = (double) draws / total * 100;
double awayRate = (double) awayWins / total * 100;
System.out.printf("总场次: %d%n", total);
System.out.printf("主胜: %d 场 (%.1f%%)%n", homeWins, homeRate);
System.out.printf("平局: %d 场 (%.1f%%)%n", draws, drawRate);
System.out.printf("客胜: %d 场 (%.1f%%)%n", awayWins, awayRate);
System.out.printf(">>> 主队胜率约为: %.2f%%%n", homeRate);
// 按主队统计各自的胜率
System.out.println("\n--- 各主队主场胜率 ---");
Map<String, int[]> stats = new HashMap<>(); // [总场, 主胜场]
for (Match m : matches) {
int[] s = stats.computeIfAbsent(m.homeTeam, k -> new int[2]);
s[0]++;
if (m.getResult() == Result.HOME_WIN) s[1]++;
}
stats.forEach((team, s) -> {
double rate = (double) s[1] / s[0] * 100;
System.out.printf("%-6s 主场 %d 场,胜 %d 场,胜率 %.1f%%%n",
team, s[0], s[1], rate);
});
}
}
运行结果(基于示例数据)
总场次: 10
主胜: 5 场 (50.0%)
平局: 2 场 (20.0%)
客胜: 3 场 (30.0%)
>>> 主队胜率约为: 50.00%
--- 各主队主场胜率 ---
曼城 主场 3 场,胜 3 场,胜率 100.0%
阿森纳 主场 2 场,胜 0 场,胜率 0.0%
利物浦 主场 1 场,胜 1 场,胜率 100.0%
曼联 主场 2 场,胜 0 场,胜率 0.0%
切尔西 主场 1 场,胜 0 场,胜率 0.0%
热刺 主场 1 场,胜 1 场,胜率 100.0%
真实场景下"主队胜率大概多少"?
示例数据是虚构的,但如果你换成真实联赛数据,经验值大概是:
| 场景 | 主胜率 | 平局 | 客胜 |
|---|---|---|---|
| 英超/西甲等五大联赛(近 10 年) | 约 45%~48% | 约 24% | 约 28%~30% |
| 中超 | 约 42%~45% | 约 25% | 约 30% |
| 世界杯等国际大赛 | 约 45% | 25%~28% | 27%~30% |
| 强主场环境(如南美/高原) | 可到 55%~60% |
职业足球中,主队胜率普遍在 45%~50% 左右,"主场优势"大约值 +0.3~0.5 个进球,对应胜率提升 3~5 个百分点。
扩展建议(生产环境)
- 数据来源:可从
football-data.org、API-Football或本地 Excel/CSV 读取。 - 改进统计:
- 分段统计(按赛季、按联赛、按球队)
- 加权(近期比赛权重更高)
- 加入置信区间(Wilson score interval)
- 注意小数精度:
(double) homeWins / total避免整数除法。 - 平局单独统计,不要算入"非主胜"里就当作客胜。
如果你把具体的比赛数据(CSV 或字段说明)发我,我可以帮你把这段代码改成直接读取文件并输出准确胜率。