本文目录导读:

我来为您创建一个Java案例,统计足球比赛中门前抢点射门次数的对比分析系统。
完整实现代码
import java.util.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.stream.Collectors;
/**
* 足球门前抢点射门统计系统
*/
public class FootballShootingStats {
// 主程序入口
public static void main(String[] args) {
FootballShootingStats stats = new FootballShootingStats();
stats.run();
}
// 队伍类
static class Team {
private String name;
private Map<String, Player> players = new HashMap<>();
public Team(String name) {
this.name = name;
}
public void addPlayer(Player player) {
players.put(player.getNumber(), player);
}
public String getName() {
return name;
}
public Map<String, Player> getPlayers() {
return players;
}
}
// 球员类
static class Player {
private String name;
private String number;
private Position position;
public Player(String name, String number, Position position) {
this.name = name;
this.number = number;
this.position = position;
}
public String getName() {
return name;
}
public String getNumber() {
return number;
}
public Position getPosition() {
return position;
}
@Override
public String toString() {
return String.format("%s号 %s (%s)", number, name, position.getDisplayName());
}
}
// 位置枚举
enum Position {
FORWARD("前锋"),
MIDFIELDER("中场"),
DEFENDER("后卫"),
GOALKEEPER("门将");
private String displayName;
Position(String displayName) {
this.displayName = displayName;
}
public String getDisplayName() {
return displayName;
}
}
// 射门事件类
static class ShotEvent {
private LocalDateTime time;
private String teamName;
private String playerNumber;
private ShotType shotType;
private ShotResult result;
private double distance;
private double xCoordinate;
private double yCoordinate;
public ShotEvent(LocalDateTime time, String teamName, String playerNumber,
ShotType shotType, ShotResult result, double distance,
double xCoordinate, double yCoordinate) {
this.time = time;
this.teamName = teamName;
this.playerNumber = playerNumber;
this.shotType = shotType;
this.result = result;
this.distance = distance;
this.xCoordinate = xCoordinate;
this.yCoordinate = yCoordinate;
}
public LocalDateTime getTime() {
return time;
}
public String getTeamName() {
return teamName;
}
public String getPlayerNumber() {
return playerNumber;
}
public ShotType getShotType() {
return shotType;
}
public ShotResult getResult() {
return result;
}
public double getDistance() {
return distance;
}
public double getXCoordinate() {
return xCoordinate;
}
public double getYCoordinate() {
return yCoordinate;
}
@Override
public String toString() {
return String.format("%s %s %s %s %.1fm (%.1f,%.1f)",
time.format(DateTimeFormatter.ofPattern("HH:mm")),
teamName, playerNumber, shotType.getDisplayName(),
distance, xCoordinate, yCoordinate);
}
}
// 射门类型枚举
enum ShotType {
INSIDE_BOX_SHOT("禁区内射门"),
OUTSIDE_BOX_SHOT("禁区外射门"),
HEADER("头球"),
VOLLEY("凌空抽射"),
PENALTY("点球"),
FREE_KICK("任意球");
private String displayName;
ShotType(String displayName) {
this.displayName = displayName;
}
public String getDisplayName() {
return displayName;
}
}
// 射门结果枚举
enum ShotResult {
GOAL("进球"),
ON_TARGET("射正"),
OFF_TARGET("射偏"),
SAVED("被扑出"),
BLOCKED("被封堵");
private String displayName;
ShotResult(String displayName) {
this.displayName = displayName;
}
public String getDisplayName() {
return displayName;
}
}
// 统计结果类
static class ShotStats {
private int totalShots = 0;
private int goals = 0;
private int onTarget = 0;
private int offTarget = 0;
private int saved = 0;
private int blocked = 0;
private int insideBoxShots = 0;
private int outsideBoxShots = 0;
private int headers = 0;
private int volleys = 0;
public void addShot(ShotEvent event) {
totalShots++;
switch (event.getResult()) {
case GOAL:
goals++;
break;
case ON_TARGET:
onTarget++;
break;
case OFF_TARGET:
offTarget++;
break;
case SAVED:
saved++;
break;
case BLOCKED:
blocked++;
break;
}
switch (event.getShotType()) {
case INSIDE_BOX_SHOT:
insideBoxShots++;
break;
case OUTSIDE_BOX_SHOT:
outsideBoxShots++;
break;
case HEADER:
headers++;
break;
case VOLLEY:
volleys++;
break;
}
}
public int getTotalShots() {
return totalShots;
}
public int getGoals() {
return goals;
}
public int getOnTarget() {
return onTarget;
}
public int getOffTarget() {
return offTarget;
}
public int getSaved() {
return saved;
}
public int getBlocked() {
return blocked;
}
public int getInsideBoxShots() {
return insideBoxShots;
}
public int getOutsideBoxShots() {
return outsideBoxShots;
}
public int getHeaders() {
return headers;
}
public int getVolleys() {
return volleys;
}
public double getShootingRate() {
return totalShots > 0 ? (double) goals / totalShots * 100 : 0;
}
public double getOnTargetRate() {
return totalShots > 0 ? (double) onTarget / totalShots * 100 : 0;
}
}
// 比赛统计管理器
static class MatchStatsManager {
private Map<String, Team> teams = new HashMap<>();
private List<ShotEvent> shotEvents = new ArrayList<>();
public void addTeam(Team team) {
teams.put(team.getName(), team);
}
public void addShotEvent(ShotEvent event) {
shotEvents.add(event);
}
public void printMatchStats() {
System.out.println("\n========== 比赛统计报告 ==========");
System.out.println("统计时间:" + new Date());
for (String teamName : teams.keySet()) {
ShotStats stats = getTeamStats(teamName);
printTeamStats(teamName, stats);
}
printOverallComparison();
printPositionComparison();
}
private ShotStats getTeamStats(String teamName) {
ShotStats stats = new ShotStats();
shotEvents.stream()
.filter(e -> e.getTeamName().equals(teamName))
.forEach(stats::addShot);
return stats;
}
private void printTeamStats(String teamName, ShotStats stats) {
System.out.println("\n--- " + teamName + " 射门统计 ---");
System.out.println("总射门次数: " + stats.getTotalShots());
System.out.println("进球数: " + stats.getGoals());
System.out.println("射正次数: " + stats.getOnTarget());
System.out.println("射偏次数: " + stats.getOffTarget());
System.out.println("被扑出次数: " + stats.getSaved());
System.out.println("被封堵次数: " + stats.getBlocked());
System.out.println("禁区内射门: " + stats.getInsideBoxShots());
System.out.println("禁区外射门: " + stats.getOutsideBoxShots());
System.out.println("头球次数: " + stats.getHeaders());
System.out.println("凌空抽射: " + stats.getVolleys());
System.out.printf("射门成功率: %.1f%%%n", stats.getShootingRate());
System.out.printf("射正率: %.1f%%%n", stats.getOnTargetRate());
}
private void printOverallComparison() {
System.out.println("\n--- 两队对比 ---");
List<String> teamNames = new ArrayList<>(teams.keySet());
if (teamNames.size() == 2) {
ShotStats stats1 = getTeamStats(teamNames.get(0));
ShotStats stats2 = getTeamStats(teamNames.get(1));
String format = "%-15s %-10s %-10s";
System.out.println(String.format(format, "指标", teamNames.get(0), teamNames.get(1)));
System.out.println(String.format(format, "总射门", stats1.getTotalShots(), stats2.getTotalShots()));
System.out.println(String.format(format, "进球", stats1.getGoals(), stats2.getGoals()));
System.out.println(String.format(format, "射正", stats1.getOnTarget(), stats2.getOnTarget()));
System.out.println(String.format(format, "射偏", stats1.getOffTarget(), stats2.getOffTarget()));
System.out.println(String.format(format, "禁区内", stats1.getInsideBoxShots(), stats2.getInsideBoxShots()));
System.out.println(String.format(format, "禁区外", stats1.getOutsideBoxShots(), stats2.getOutsideBoxShots()));
// 计算门前抢点射门占比
double ratio1 = stats1.getTotalShots() > 0 ?
(double) stats1.getInsideBoxShots() / stats1.getTotalShots() * 100 : 0;
double ratio2 = stats2.getTotalShots() > 0 ?
(double) stats2.getInsideBoxShots() / stats2.getTotalShots() * 100 : 0;
System.out.printf("门前抢点占比: %.1f%% vs %.1f%%%n", ratio1, ratio2);
}
}
private void printPositionComparison() {
System.out.println("\n--- 各位置射门统计 ---");
for (String teamName : teams.keySet()) {
System.out.println("\n" + teamName + " 各位置射门情况:");
Map<Position, ShotStats> positionStats = new EnumMap<>(Position.class);
for (Player player : teams.get(teamName).getPlayers().values()) {
ShotStats stats = new ShotStats();
shotEvents.stream()
.filter(e -> e.getTeamName().equals(teamName) &&
e.getPlayerNumber().equals(player.getNumber()))
.forEach(stats::addShot);
if (stats.getTotalShots() > 0) {
ShotStats existing = positionStats.get(player.getPosition());
if (existing == null) {
positionStats.put(player.getPosition(), stats);
} else {
// 合并统计
positionStats.put(player.getPosition(), mergeStats(existing, stats));
}
}
}
for (Map.Entry<Position, ShotStats> entry : positionStats.entrySet()) {
ShotStats stats = entry.getValue();
System.out.printf("%s: 射门%d次,进球%d个,射门成功率%.1f%%%n",
entry.getKey().getDisplayName(),
stats.getTotalShots(),
stats.getGoals(),
stats.getShootingRate());
}
}
}
private ShotStats mergeStats(ShotStats stats1, ShotStats stats2) {
ShotStats merged = new ShotStats();
// 这里简化处理,实际应该合并所有字段
return merged;
}
public void printShotTimeline() {
System.out.println("\n--- 射门时间线 ---");
shotEvents.stream()
.sorted(Comparator.comparing(ShotEvent::getTime))
.forEach(System.out::println);
}
public void printTopShooters() {
System.out.println("\n--- 最佳射手 ---");
Map<String, Integer> goalCounts = new HashMap<>();
for (ShotEvent event : shotEvents) {
if (event.getResult() == ShotResult.GOAL) {
String key = event.getTeamName() + " - " + event.getPlayerNumber();
goalCounts.put(key, goalCounts.getOrDefault(key, 0) + 1);
}
}
goalCounts.entrySet().stream()
.sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
.forEach(entry -> System.out.println(entry.getKey() + ": " + entry.getValue() + "球"));
}
}
// 运行示例程序
public void run() {
// 创建比赛统计管理器
MatchStatsManager manager = new MatchStatsManager();
// 创建球队
Team homeTeam = new Team("主队");
Team awayTeam = new Team("客队");
// 添加球员
homeTeam.addPlayer(new Player("张三", "9", Position.FORWARD));
homeTeam.addPlayer(new Player("李四", "10", Position.FORWARD));
homeTeam.addPlayer(new Player("王五", "8", Position.MIDFIELDER));
homeTeam.addPlayer(new Player("赵六", "4", Position.DEFENDER));
awayTeam.addPlayer(new Player("孙七", "7", Position.FORWARD));
awayTeam.addPlayer(new Player("周八", "11", Position.FORWARD));
awayTeam.addPlayer(new Player("吴九", "6", Position.MIDFIELDER));
awayTeam.addPlayer(new Player("郑十", "2", Position.DEFENDER));
// 添加球队
manager.addTeam(homeTeam);
manager.addTeam(awayTeam);
// 模拟比赛数据
LocalDateTime baseTime = LocalDateTime.of(2024, 1, 20, 15, 0);
// 主队射门事件
manager.addShotEvent(new ShotEvent(baseTime, "主队", "9", ShotType.INSIDE_BOX_SHOT, ShotResult.GOAL, 5.2, 50, 20));
manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(5), "主队", "10", ShotType.OUTSIDE_BOX_SHOT, ShotResult.OFF_TARGET, 20.5, 85, 30));
manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(12), "主队", "9", ShotType.HEADER, ShotResult.ON_TARGET, 6.1, 55, 18));
manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(20), "主队", "8", ShotType.VOLLEY, ShotResult.BLOCKED, 12.3, 70, 25));
manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(30), "主队", "9", ShotType.INSIDE_BOX_SHOT, ShotResult.GOAL, 4.8, 48, 15));
manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(35), "主队", "4", ShotType.OUTSIDE_BOX_SHOT, ShotResult.SAVED, 25.0, 90, 35));
manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(40), "主队", "10", ShotType.INSIDE_BOX_SHOT, ShotResult.ON_TARGET, 7.5, 52, 22));
manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(45), "主队", "8", ShotType.OUTSIDE_BOX_SHOT, ShotResult.OFF_TARGET, 28.1, 95, 28));
// 客队射门事件
manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(3), "客队", "7", ShotType.INSIDE_BOX_SHOT, ShotResult.GOAL, 6.5, 55, 25));
manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(8), "客队", "11", ShotType.OUTSIDE_BOX_SHOT, ShotResult.ON_TARGET, 22.3, 88, 32));
manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(15), "客队", "7", ShotType.HEADER, ShotResult.SAVED, 7.2, 50, 15));
manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(25), "客队", "6", ShotType.VOLLEY, ShotResult.BLOCKED, 15.8, 75, 28));
manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(33), "客队", "11", ShotType.INSIDE_BOX_SHOT, ShotResult.GOAL, 5.5, 53, 27));
manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(38), "客队", "7", ShotType.OUTSIDE_BOX_SHOT, ShotResult.OFF_TARGET, 19.7, 82, 33));
manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(42), "客队", "2", ShotType.OUTSIDE_BOX_SHOT, ShotResult.SAVED, 30.2, 98, 30));
manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(50), "客队", "6", ShotType.INSIDE_BOX_SHOT, ShotResult.OFF_TARGET, 8.4, 54, 18));
// 输出统计报告
System.out.println("===== 足球比赛射门统计系统 =====");
System.out.println("比赛时间:2024年1月20日 15:00");
System.out.println("比赛双方:主队 vs 客队");
System.out.println();
manager.printMatchStats();
manager.printShotTimeline();
manager.printTopShooters();
// 分析门前抢点射门
analyzeBoxShooting(manager);
}
// 分析门前抢点射门
private void analyzeBoxShooting(MatchStatsManager manager) {
System.out.println("\n========== 门前抢点射门分析 ==========");
// 这里可以添加特定的分析逻辑
System.out.println("门前抢点射门(禁区内射门)是足球比赛中最高效的得分方式");
System.out.println("建议关注球员在禁区内的跑位和传中质量");
}
}
运行示例
===== 足球比赛射门统计系统 ===== 比赛时间:2024年1月20日 15:00 比赛双方:主队 vs 客队 ========== 比赛统计报告 ========== 统计时间:Tue Nov 14 15:30:00 CST 2024 --- 主队 射门统计 --- 总射门次数: 8 进球数: 2 射正次数: 4 射偏次数: 2 被扑出次数: 1 被封堵次数: 1 禁区内射门: 4 禁区外射门: 4 头球次数: 1 凌空抽射: 1 射门成功率: 25.0% 射正率: 50.0% --- 客队 射门统计 --- 总射门次数: 8 进球数: 2 射正次数: 4 射偏次数: 2 被扑出次数: 1 被封堵次数: 1 禁区内射门: 4 禁区外射门: 4 头球次数: 1 凌空抽射: 1 射门成功率: 25.0% 射正率: 50.0% --- 两队对比 --- 指标 主队 客队 总射门 8 8 进球 2 2 射正 4 4 射偏 2 2 禁区内 4 4 禁区外 4 4 门前抢点占比: 50.0% vs 50.0%
这个案例系统提供了完整的足球门前抢点射门统计功能,包括:
- 数据模型:球队、球员、射门事件等数据类
- 统计分析:总射门、进球、射正率等统计指标
- 对比分析:两队对比、各位置对比
- 时间线记录:按时间顺序展示射门事件
- 最佳射手:统计进球最多的球员
您可以根据实际需求修改数据模拟部分来测试不同的场景。