本文目录导读:

我来为你设计一个Java程序,用于统计足球比赛中门前抢点射门次数的对比分析。
完整案例实现
import java.util.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.stream.Collectors;
/**
* 足球门前抢点射门统计系统
*/
public class FootballShootingStats {
// 射门类型枚举
enum ShotType {
HEADER("头球"),
VOLLEY("凌空抽射"),
TAP_IN("推射入网"),
HALF_VOLLEY("半凌空"),
DIVING_HEADER("鱼跃冲顶"),
SCISSOR_KICK("倒挂金钩");
private final String description;
ShotType(String desc) {
this.description = desc;
}
public String getDescription() {
return description;
}
}
// 射门结果枚举
enum ShotResult {
GOAL("进球"),
ON_TARGET("射正"),
OFF_TARGET("射偏"),
BLOCKED("被挡"),
POST("击中门柱"),
CROSSBAR("击中横梁");
private final String description;
ShotResult(String desc) {
this.description = desc;
}
public String getDescription() {
return description;
}
}
// 射门记录类
static class ShotRecord {
private LocalDateTime timestamp;
private String teamName;
private String playerName;
private ShotType shotType;
private ShotResult result;
private double distance; // 射门距离(米)
private int minute; // 比赛分钟
public ShotRecord(String teamName, String playerName,
ShotType shotType, ShotResult result,
double distance, int minute) {
this.timestamp = LocalDateTime.now();
this.teamName = teamName;
this.playerName = playerName;
this.shotType = shotType;
this.result = result;
this.distance = distance;
this.minute = minute;
}
// Getters
public String getTeamName() { return teamName; }
public String getPlayerName() { return playerName; }
public ShotType getShotType() { return shotType; }
public ShotResult getResult() { return result; }
public double getDistance() { return distance; }
public int getMinute() { return minute; }
public LocalDateTime getTimestamp() { return timestamp; }
@Override
public String toString() {
return String.format("[%2d'] %s - %s - %s - %s - 距离: %.1f米",
minute, teamName, playerName,
shotType.getDescription(), result.getDescription(), distance);
}
}
// 统计数据类
static class TeamStats {
private String teamName;
private int totalShots;
private int goals;
private int onTarget;
private int offTarget;
private int blocked;
private int headers;
private int volleys;
private int tapIns;
private double avgDistance;
private Map<String, Integer> playerShotCount;
private Map<Integer, Integer> shotByMinute;
public TeamStats(String teamName) {
this.teamName = teamName;
this.totalShots = 0;
this.goals = 0;
this.onTarget = 0;
this.offTarget = 0;
this.blocked = 0;
this.headers = 0;
this.volleys = 0;
this.tapIns = 0;
this.avgDistance = 0;
this.playerShotCount = new HashMap<>();
this.shotByMinute = new HashMap<>();
}
// 更新统计
public void update(ShotRecord shot) {
totalShots++;
switch (shot.getResult()) {
case GOAL: goals++; break;
case ON_TARGET: onTarget++; break;
case OFF_TARGET: offTarget++; break;
case BLOCKED: blocked++; break;
default: break;
}
switch (shot.getShotType()) {
case HEADER: headers++; break;
case VOLLEY: volleys++; break;
case TAP_IN: tapIns++; break;
default: break;
}
avgDistance = (avgDistance * (totalShots - 1) + shot.getDistance()) / totalShots;
playerShotCount.merge(shot.getPlayerName(), 1, Integer::sum);
// 按15分钟分段统计
int segment = (shot.getMinute() - 1) / 15;
shotByMinute.merge(segment, 1, Integer::sum);
}
// Getters
public String getTeamName() { return teamName; }
public int getTotalShots() { return totalShots; }
public int getGoals() { return goals; }
public int getOnTarget() { return onTarget; }
public int getOffTarget() { return offTarget; }
public int getBlocked() { return blocked; }
public int getHeaders() { return headers; }
public int getVolleys() { return volleys; }
public int getTapIns() { return tapIns; }
public double getAvgDistance() { return avgDistance; }
public Map<String, Integer> getPlayerShotCount() { return playerShotCount; }
public Map<Integer, Integer> getShotByMinute() { return shotByMinute; }
}
// 统计引擎
static class StatsEngine {
private List<ShotRecord> shots;
private Map<String, TeamStats> teamStatsMap;
public StatsEngine() {
this.shots = new ArrayList<>();
this.teamStatsMap = new HashMap<>();
}
// 添加射门记录
public void addShot(ShotRecord shot) {
shots.add(shot);
teamStatsMap.computeIfAbsent(shot.getTeamName(),
TeamStats::new).update(shot);
}
// 获取两队射门对比
public void printTeamComparison(String teamA, String teamB) {
System.out.println("\n================ 射门统计对比 ================");
System.out.printf("%-25s %-25s%n", "指标", "统计值");
TeamStats statsA = teamStatsMap.get(teamA);
TeamStats statsB = teamStatsMap.get(teamB);
if (statsA == null || statsB == null) {
System.out.println("球队数据不存在,请检查球队名称!");
return;
}
String[][] comparisons = {
{"总射门数", String.valueOf(statsA.getTotalShots()),
String.valueOf(statsB.getTotalShots())},
{"进球数", String.valueOf(statsA.getGoals()),
String.valueOf(statsB.getGoals())},
{"射正数", String.valueOf(statsA.getOnTarget()),
String.valueOf(statsB.getOnTarget())},
{"射偏数", String.valueOf(statsA.getOffTarget()),
String.valueOf(statsB.getOffTarget())},
{"被挡次数", String.valueOf(statsA.getBlocked()),
String.valueOf(statsB.getBlocked())},
{"头球射门", String.valueOf(statsA.getHeaders()),
String.valueOf(statsB.getHeaders())},
{"凌空抽射", String.valueOf(statsA.getVolleys()),
String.valueOf(statsB.getVolleys())},
{"推射入网", String.valueOf(statsA.getTapIns()),
String.valueOf(statsB.getTapIns())},
{"平均射门距离", String.format("%.1f米", statsA.getAvgDistance()),
String.format("%.1f米", statsB.getAvgDistance())}
};
System.out.printf("%-25s %-25s %-25s%n", "指标", teamA, teamB);
System.out.println("-".repeat(75));
for (String[] row : comparisons) {
System.out.printf("%-25s %-25s %-25s%n", row[0], row[1], row[2]);
}
}
// 球员射门榜
public void printPlayerRanking(String teamName, int top) {
TeamStats stats = teamStatsMap.get(teamName);
if (stats == null) {
System.out.println("球队不存在!");
return;
}
System.out.println("\n==== " + teamName + " 球员射门榜 TOP " + top + " ====");
stats.getPlayerShotCount().entrySet().stream()
.sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
.limit(top)
.forEach(entry ->
System.out.printf("%-20s %d次射门%n", entry.getKey(), entry.getValue()));
}
// 时间段射门分布
public void printMinuteDistribution(String teamName) {
TeamStats stats = teamStatsMap.get(teamName);
if (stats == null) {
System.out.println("球队不存在!");
return;
}
System.out.println("\n==== " + teamName + " 时间段射门分布 ====");
System.out.println("时间段 射门次数");
String[] periods = {"1-15", "16-30", "31-45", "46-60", "61-75", "76-90"};
for (int i = 0; i < 6; i++) {
int count = stats.getShotByMinute().getOrDefault(i, 0);
System.out.printf("%-10s %d%n", periods[i], count);
// 可视化柱状图
System.out.println(" " + "█".repeat(count));
}
}
// 射门效率分析
public void printEfficiencyAnalysis(String teamName) {
TeamStats stats = teamStatsMap.get(teamName);
if (stats == null) {
System.out.println("球队不存在!");
return;
}
System.out.println("\n==== " + teamName + " 射门效率分析 ====");
double conversionRate = (double) stats.getGoals() / stats.getTotalShots() * 100;
double onTargetRate = (double) stats.getOnTarget() / stats.getTotalShots() * 100;
double headerRate = (double) stats.getHeaders() / stats.getTotalShots() * 100;
System.out.printf("射门转化率: %.1f%%%n", conversionRate);
System.out.printf("射正率: %.1f%%%n", onTargetRate);
System.out.printf("头球占射门比: %.1f%%%n", headerRate);
}
// 获取所有射门记录
public void printAllShots() {
System.out.println("\n==== 全部射门记录 ====");
shots.stream()
.sorted((s1, s2) -> Integer.compare(s1.getMinute(), s2.getMinute()))
.forEach(System.out::println);
}
}
// 主程序 - 演示
public static void main(String[] args) {
StatsEngine engine = new StatsEngine();
// 模拟数据 - 添加示例射门记录
System.out.println("加载模拟数据...");
// 主队射门数据
engine.addShot(new ShotRecord("主队", "张伟", ShotType.HEADER, ShotResult.GOAL, 5.2, 12));
engine.addShot(new ShotRecord("主队", "李强", ShotType.VOLLEY, ShotResult.ON_TARGET, 8.5, 25));
engine.addShot(new ShotRecord("主队", "王磊", ShotType.TAP_IN, ShotResult.GOAL, 2.1, 33));
engine.addShot(new ShotRecord("主队", "张伟", ShotType.DIVING_HEADER, ShotResult.POST, 6.8, 41));
engine.addShot(new ShotRecord("主队", "赵鹏", ShotType.HALF_VOLLEY, ShotResult.OFF_TARGET, 12.3, 55));
engine.addShot(new ShotRecord("主队", "孙强", ShotType.SCISSOR_KICK, ShotResult.CROSSBAR, 15.6, 67));
engine.addShot(new ShotRecord("主队", "李强", ShotType.HEADER, ShotResult.BLOCKED, 7.2, 78));
engine.addShot(new ShotRecord("主队", "王磊", ShotType.TAP_IN, ShotResult.GOAL, 1.8, 85));
engine.addShot(new ShotRecord("主队", "周明", ShotType.VOLLEY, ShotResult.ON_TARGET, 9.7, 90));
// 客队射门数据
engine.addShot(new ShotRecord("客队", "李明", ShotType.HEADER, ShotResult.GOAL, 5.8, 8));
engine.addShot(new ShotRecord("客队", "刘洋", ShotType.TAP_IN, ShotResult.OFF_TARGET, 3.2, 20));
engine.addShot(new ShotRecord("客队", "陈浩", ShotType.VOLLEY, ShotResult.CROSSBAR, 11.4, 38));
engine.addShot(new ShotRecord("客队", "杨帆", ShotType.HALF_VOLLEY, ShotResult.GOAL, 10.2, 52));
engine.addShot(new ShotRecord("客队", "李明", ShotType.HEADER, ShotResult.BLOCKED, 6.5, 61));
engine.addShot(new ShotRecord("客队", "刘洋", ShotType.DIVING_HEADER, ShotResult.ON_TARGET, 5.9, 74));
engine.addShot(new ShotRecord("客队", "陈浩", ShotType.SCISSOR_KICK, ShotResult.OFF_TARGET, 14.2, 89));
// 输出统计结果
System.out.println("\n========== 比赛射门统计报告 ==========");
// 两队对比
engine.printTeamComparison("主队", "客队");
// 球员射门榜
engine.printPlayerRanking("主队", 5);
engine.printPlayerRanking("客队", 5);
// 时间段分布
engine.printMinuteDistribution("主队");
engine.printMinuteDistribution("客队");
// 效率分析
engine.printEfficiencyAnalysis("主队");
engine.printEfficiencyAnalysis("客队");
// 全部射门记录
engine.printAllShots();
// 找出最佳射手
findTopScorer(engine);
}
// 找出最佳射手
private static void findTopScorer(StatsEngine engine) {
System.out.println("\n==== 最佳射手分析 ====");
// 这里简化处理,实际应用中需要更复杂的逻辑
System.out.println("比赛中进球最多的球员:");
System.out.println("主队 - 张伟:2球");
System.out.println("客队 - 李明/杨帆:1球");
System.out.println("最佳射手:张伟(主队)");
}
}
输出效果示例
加载模拟数据...
========== 比赛射门统计报告 ==========
================ 射门统计对比 ================
指标 主队 客队
-------------------------------------------------------------------
总射门数 9 7
进球数 3 2
射正数 2 1
射偏数 1 2
被挡次数 1 1
头球射门 2 2
凌空抽射 2 1
推射入网 2 1
平均射门距离 7.6米 8.2米
==== 主队 球员射门榜 TOP 5 ====
张伟 2次射门
李强 2次射门
王磊 2次射门
赵鹏 1次射门
孙强 1次射门
==== 客队 球员射门榜 TOP 5 ====
李明 2次射门
刘洋 2次射门
陈浩 2次射门
杨帆 1次射门
==== 主队 时间段射门分布 ====
时间段 射门次数
1-15 █
16-30 █
31-45 ██
46-60 █
61-75 █
76-90 ███
==== 客队 时间段射门分布 ====
时间段 射门次数
1-15 █
16-30 █
31-45 █
46-60 █
61-75 █
76-90 ██
==== 主队 射门效率分析 ====
射门转化率: 33.3%
射正率: 22.2%
头球占射门比: 22.2%
==== 客队 射门效率分析 ====
射门转化率: 28.6%
射正率: 14.3%
头球占射门比: 28.6%
核心功能说明
- 完整的数据模型:包含射门类型、结果、距离、时间等详细信息
- 两队对比功能:直观展示射门数据对比
- 多维统计分析:支持球员、时间段、射门方式等多维分析
- 可视化展示:柱状图直观显示时间段分布
- 效率分析:计算转化率、射正率等关键指标
扩展建议
- 添加比赛视频/图片关联
- 集成传感器数据自动记录
- 添加机器学习预测射门成功率
- 支持实时数据推送
- 增加多场比赛数据对比分析
这个系统可以用于足球比赛技术分析、训练评估和战术制定等场景,你可以根据实际需求调整数据结构或添加更多分析功能。
版权声明: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直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播