足球红黄牌统计案例(Java)
下面是一个完整的 Java 案例:统计一场比赛中哪队红黄牌更多。

需求说明
- 输入两队的红黄牌记录
- 分别统计红牌、黄牌数量
- 按"红牌优先,黄牌次之"比较哪队罚牌更严重(更多)
- 输出结果
说明:足球规则中红牌 = 直接罚下,黄牌两次变红,为公平比较可用罚分制:红牌 3 分、黄牌 1 分,这里两种方式都实现。
完整代码
import java.util.*;
public class CardStatistics {
// 罚牌数据结构
static class TeamCards {
String teamName;
int red; // 红牌数
int yellow; // 黄牌数
TeamCards(String name) {
this.teamName = name;
}
// 罚分:红牌3分,黄牌1分
int penalty() {
return red * 3 + yellow;
}
@Override
public String toString() {
return teamName + " → 红牌:" + red + " 张,黄牌:" + yellow + " 张,罚分:" + penalty();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入主队名称:");
String homeName = sc.nextLine();
System.out.print("请输入客队名称:");
String awayName = sc.nextLine();
TeamCards home = new TeamCards(homeName);
TeamCards away = new TeamCards(awayName);
// 输入主队红黄牌
System.out.print("输入 " + homeName + " 红牌数:");
home.red = sc.nextInt();
System.out.print("输入 " + homeName + " 黄牌数:");
home.yellow = sc.nextInt();
// 输入客队红黄牌
System.out.print("输入 " + awayName + " 红牌数:");
away.red = sc.nextInt();
System.out.print("输入 " + awayName + " 黄牌数:");
away.yellow = sc.nextInt();
System.out.println("\n========== 统计结果 ==========");
System.out.println(home);
System.out.println(away);
System.out.println("------------------------------");
compare(home, away);
sc.close();
}
// 比较哪队罚牌更多
static void compare(TeamCards a, TeamCards b) {
// 优先比红牌,再比黄牌(更符合足球直觉)
if (a.red != b.red) {
System.out.println("红牌更多的队:" + (a.red > b.red ? a.teamName : b.teamName));
} else if (a.yellow != b.yellow) {
System.out.println("红牌相同,黄牌更多的队:" + (a.yellow > b.yellow ? a.teamName : b.teamName));
} else {
System.out.println("两队红黄牌数量完全相同!");
}
// 附加:罚分比较
if (a.penalty() > b.penalty()) {
System.out.println("按罚分制,罚牌更严重的是:" + a.teamName + "(" + a.penalty() + " 分)");
} else if (a.penalty() < b.penalty()) {
System.out.println("按罚分制,罚牌更严重的是:" + b.teamName + "(" + b.penalty() + " 分)");
} else {
System.out.println("按罚分制,两队罚牌程度相同(均为 " + a.penalty() + " 分)");
}
}
}
运行示例
请输入主队名称:广州队
请输入客队名称:北京队
输入 广州队 红牌数:1
输入 广州队 黄牌数:3
输入 北京队 红牌数:0
输入 北京队 黄牌数:5
========== 统计结果 ==========
广州队 → 红牌:1 张,黄牌:3 张,罚分:6
北京队 → 红牌:0 张,黄牌:5 张,罚分:5
------------------------------
红牌更多的队:广州队
按罚分制,罚牌更严重的是:广州队(6 分)
关键点解析
| 要点 | 说明 |
|---|---|
| 数据封装 | 用 TeamCards 类封装队名、红牌、黄牌,便于扩展 |
| 比较策略 | 先比红牌→再比黄牌→最后相同,符合"红牌更严重"的足球直觉 |
| 罚分制 | 红 3 分 / 黄 1 分,能反映"两张黄牌 = 一张红牌"的规则直觉 |
| 可扩展 | 可轻松接入数据库/文件读取比赛事件流 |
进阶:从事件流统计(更贴近真实场景)
如果数据是从比赛事件记录逐条读取(如 "黄牌,张三,广州队"),可用集合统计:
static TeamCards countFromEvents(String teamName, List<String[]> events) {
TeamCards tc = new TeamCards(teamName);
for (String[] e : events) {
if (!e[2].equals(teamName)) continue; // e[2] 是队伍
if (e[0].equals("红牌")) tc.red++;
else if (e[0].equals("黄牌")) tc.yellow++;
}
return tc;
}
这样就能对整场比赛所有事件一次性统计出哪队红黄牌更多。
如果你需要从文件读取、用 Map 统计、或图形界面版本,告诉我具体场景,我可以继续补充完整代码。