本文目录导读:

我来为您创建一个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%
这个案例系统提供了完整的足球门前抢点射门统计功能,包括:
- 数据模型:球队、球员、射门事件等数据类
- 统计分析:总射门、进球、射正率等统计指标
- 对比分析:两队对比、各位置对比
- 时间线记录:按时间顺序展示射门事件
- 最佳射手:统计进球最多的球员
您可以根据实际需求修改数据模拟部分来测试不同的场景。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播