本文目录导读:

我来提供一个Java案例,统计两支球队比赛中红黄牌数量并比较哪队更多。
完整实现代码
import java.util.*;
/**
* 红黄牌统计和比较案例
*/
public class CardStatistics {
// 比赛事件类
static class MatchEvent {
String teamName; // 队名
String cardType; // 牌类型:RED或YELLOW
int minute; // 比赛分钟
String player; // 球员姓名
public MatchEvent(String teamName, String cardType, int minute, String player) {
this.teamName = teamName;
this.cardType = cardType;
this.minute = minute;
this.player = player;
}
@Override
public String toString() {
return String.format("[%d分钟] %s %s - %s",
minute, teamName, cardType.equals("RED") ? "红牌" : "黄牌", player);
}
}
// 球队统计类
static class TeamStats {
String teamName;
int yellowCards = 0;
int redCards = 0;
List<MatchEvent> events = new ArrayList<>();
public TeamStats(String teamName) {
this.teamName = teamName;
}
public int getTotalCards() {
return yellowCards + redCards; // 红牌计1分,黄牌计1分
}
public int getCardScore() {
return redCards * 2 + yellowCards; // 红牌权重更高
}
}
public static void main(String[] args) {
// 模拟比赛数据
List<MatchEvent> matchEvents = createMatchData();
// 统计数据
Map<String, TeamStats> statsMap = new HashMap<>();
for (MatchEvent event : matchEvents) {
TeamStats stats = statsMap.computeIfAbsent(event.teamName, TeamStats::new);
if (event.cardType.equals("RED")) {
stats.redCards++;
} else {
stats.yellowCards++;
}
stats.events.add(event);
}
// 输出统计结果
printStatistics(statsMap);
// 比较哪队更多
compareTeams(statsMap);
}
/**
* 创建模拟比赛数据
*/
private static List<MatchEvent> createMatchData() {
List<MatchEvent> events = new ArrayList<>();
// 添加比赛事件 (示例数据)
// 主队:皇家马德里,客队:巴塞罗那
// 皇家马德里的黄牌
events.add(new MatchEvent("皇家马德里", "YELLOW", 12, "卡塞米罗"));
events.add(new MatchEvent("皇家马德里", "YELLOW", 34, "拉莫斯"));
events.add(new MatchEvent("皇家马德里", "RED", 58, "马塞洛"));
events.add(new MatchEvent("皇家马德里", "YELLOW", 76, "巴尔韦德"));
// 巴塞罗那的黄牌和红牌
events.add(new MatchEvent("巴塞罗那", "YELLOW", 25, "布斯克茨"));
events.add(new MatchEvent("巴塞罗那", "YELLOW", 42, "皮克"));
events.add(new MatchEvent("巴塞罗那", "RED", 67, "阿尔巴"));
events.add(new MatchEvent("巴塞罗那", "YELLOW", 83, "德容"));
events.add(new MatchEvent("巴塞罗那", "YELLOW", 90, "梅西"));
return events;
}
/**
* 打印统计数据
*/
private static void printStatistics(Map<String, TeamStats> statsMap) {
System.out.println("========== 红黄牌统计 ==========");
System.out.println();
for (TeamStats stats : statsMap.values()) {
System.out.println("球队: " + stats.teamName);
System.out.println(" 黄牌数量: " + stats.yellowCards + " 张");
System.out.println(" 红牌数量: " + stats.redCards + " 张");
System.out.println(" 总牌数: " + stats.getTotalCards() + " 张");
System.out.println(" 权重分: " + stats.getCardScore() + " (红牌×2 + 黄牌)");
System.out.println();
}
}
/**
* 比较两队数据
*/
private static void compareTeams(Map<String, TeamStats> statsMap) {
// 获取所有球队
List<TeamStats> teams = new ArrayList<>(statsMap.values());
if (teams.size() < 2) {
System.out.println("至少需要两支球队才能比较!");
return;
}
// 按总牌数排序比较
teams.sort((a, b) -> Integer.compare(b.getTotalCards(), a.getTotalCards()));
TeamStats first = teams.get(0);
TeamStats second = teams.get(1);
System.out.println("========== 比较结果 ==========");
// 按总牌数比较
if (first.getTotalCards() != second.getTotalCards()) {
System.out.println("总牌数: " + first.teamName + " (" + first.getTotalCards() +
"张) > " + second.teamName + " (" + second.getTotalCards() + "张)");
} else {
System.out.println("总牌数相同: 都是 " + first.getTotalCards() + " 张");
}
// 按权重分比较
if (first.getCardScore() != second.getCardScore()) {
System.out.println("权重分: " + first.teamName + " (" + first.getCardScore() +
"分) > " + second.teamName + " (" + second.getCardScore() + "分)");
} else {
System.out.println("权重分相同: 都是 " + first.getCardScore() + " 分");
}
// 单独比较红牌
if (first.redCards != second.redCards) {
String moreRedCards = first.redCards > second.redCards ? first.teamName : second.teamName;
System.out.println("红牌更多: " + moreRedCards);
} else {
System.out.println("红牌数量相同: 都是 " + first.redCards + " 张");
}
// 最终判断
System.out.println();
System.out.println("最终判断:");
if (first.getCardScore() != second.getCardScore()) {
String moreCards = first.getCardScore() > second.getCardScore() ?
first.teamName : second.teamName;
System.out.println("按权重分计算," + moreCards + " 更" +
(first.getCardScore() > second.getCardScore() ? "多" : "多"));
} else if (first.getTotalCards() != second.getTotalCards()) {
String moreCards = first.getTotalCards() > second.getTotalCards() ?
first.teamName : second.teamName;
System.out.println("按总牌数计算," + moreCards + " 更多");
} else {
System.out.println("两队红黄牌数完全相同,无法分出高下!");
}
}
}
运行结果示例
========== 红黄牌统计 ==========
球队: 皇家马德里
黄牌数量: 3 张
红牌数量: 1 张
总牌数: 4 张
权重分: 5 (红牌×2 + 黄牌)
球队: 巴塞罗那
黄牌数量: 4 张
红牌数量: 1 张
总牌数: 5 张
权重分: 6 (红牌×2 + 黄牌)
========== 比较结果 ==========
总牌数: 巴塞罗那 (5张) > 皇家马德里 (4张)
权重分: 巴塞罗那 (6分) > 皇家马德里 (5分)
红牌数量相同: 都是 1 张
最终判断:
按权重分计算,巴塞罗那 更多
扩展功能版本(支持多球队)
import java.util.*;
import java.util.stream.Collectors;
/**
* 支持多球队比较的红黄牌统计系统
*/
public class MultiTeamCardStatistics {
static class CardRecord {
String team;
String player;
String cardType; // "RED" or "YELLOW"
int minute;
public CardRecord(String team, String player, String cardType, int minute) {
this.team = team;
this.player = player;
this.cardType = cardType;
this.minute = minute;
}
}
public static void main(String[] args) {
// 模拟多场比赛数据
List<CardRecord> records = Arrays.asList(
new CardRecord("曼城", "德布劳内", "YELLOW", 23),
new CardRecord("利物浦", "范迪克", "YELLOW", 32),
new CardRecord("曼城", "罗德里", "RED", 45),
new CardRecord("切尔西", "芒特", "YELLOW", 56),
new CardRecord("利物浦", "萨拉赫", "YELLOW", 61),
new CardRecord("切尔西", "哈弗茨", "RED", 68),
new CardRecord("曼城", "沃克", "YELLOW", 75),
new CardRecord("切尔西", "詹姆斯", "YELLOW", 82)
);
// 使用 Stream 进行统计
Map<String, Map<String, Long>> summary = records.stream()
.collect(Collectors.groupingBy(
r -> r.team,
Collectors.groupingBy(
r -> r.cardType,
Collectors.counting()
)
));
// 计算总牌数
System.out.println("========== 各球队红黄牌统计 ==========");
System.out.printf("%-10s %-8s %-8s %-8s %-8s%n",
"球队", "黄牌", "红牌", "总牌数", "权重分");
System.out.println("----------------------------------------");
for (String team : summary.keySet()) {
Map<String, Long> cards = summary.get(team);
long yellow = cards.getOrDefault("YELLOW", 0L);
long red = cards.getOrDefault("RED", 0L);
long total = yellow + red;
long score = red * 2 + yellow;
System.out.printf("%-10s %-8d %-8d %-8d %-8d%n",
team, yellow, red, total, score);
}
// 找出红黄牌最多的球队
System.out.println("\n========== 最终判决 ==========");
String maxTeam = summary.entrySet().stream()
.max((e1, e2) -> {
long s1 = getScore(e1.getValue());
long s2 = getScore(e2.getValue());
return Long.compare(s1, s2);
})
.get().getKey();
System.out.println("红黄牌最多的球队是: " + maxTeam);
}
private static long getScore(Map<String, Long> cards) {
long yellow = cards.getOrDefault("YELLOW", 0L);
long red = cards.getOrDefault("RED", 0L);
return red * 2 + yellow;
}
}
功能说明
- 数据统计:统计每队的黄牌数和红牌数
- 多种比较方式:
- 总牌数比较(黄牌+红牌)
- 权重分比较(红牌×2 + 黄牌)
- 红牌数量单独比较
- 灵活性:可以轻松修改比较规则
- 代码简洁:使用Java 8 Stream进行简化处理
使用建议
- 如果红牌有更高的纪律处罚意义,可以使用权重分比较
- 如果需要更简单的比较,直接使用总牌数即可
- 代码可以扩展支持更多统计维度(如球员个人统计、比赛轮次等)