本文目录导读:

我理解您想要一个Java案例来统计定位球(比如任意球、角球、点球等)的得分占比,这里提供一个完整的示例:
完整Java案例
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SetPieceScoreAnalyzer {
// 定位球类型枚举
enum SetPieceType {
FREE_KICK("任意球"),
CORNER_KICK("角球"),
PENALTY("点球"),
THROW_IN("界外球"),
OTHER("其他");
private String chineseName;
SetPieceType(String chineseName) {
this.chineseName = chineseName;
}
public String getChineseName() {
return chineseName;
}
}
// 进球实体类
static class Goal {
private String playerName;
private SetPieceType type;
private int minute;
public Goal(String playerName, SetPieceType type, int minute) {
this.playerName = playerName;
this.type = type;
this.minute = minute;
}
public SetPieceType getType() {
return type;
}
public int getMinute() {
return minute;
}
@Override
public String toString() {
return String.format("[%d分钟] %s - %s进球",
minute, playerName, type.getChineseName());
}
}
// 统计数据类
static class StatsData {
private List<Goal> allGoals;
private Map<SetPieceType, Integer> setPieceGoals;
private int totalGoals;
public StatsData() {
this.allGoals = new ArrayList<>();
this.setPieceGoals = new HashMap<>();
this.totalGoals = 0;
}
// 添加进球
public void addGoal(Goal goal) {
allGoals.add(goal);
totalGoals++;
setPieceGoals.merge(goal.getType(), 1, Integer::sum);
}
// 计算定位球得分占比
public Map<SetPieceType, Double> calculateSetPiecePercentage() {
Map<SetPieceType, Double> percentages = new HashMap<>();
for (Map.Entry<SetPieceType, Integer> entry : setPieceGoals.entrySet()) {
percentages.put(entry.getKey(),
(double) entry.getValue() / totalGoals * 100);
}
return percentages;
}
// 生成统计报告
public void printReport() {
System.out.println("=========== 进球统计报告 ===========");
System.out.printf("总进球数: %d球%n", totalGoals);
System.out.println("-----------------------------------");
if (allGoals.isEmpty()) {
System.out.println("暂无进球数据");
return;
}
// 显示所有进球
System.out.println("详细进球记录:");
for (Goal goal : allGoals) {
System.out.println(" " + goal);
}
System.out.println("-----------------------------------");
System.out.println("定位球得分占比分析:");
Map<SetPieceType, Double> percentages = calculateSetPiecePercentage();
// 排序输出
percentages.entrySet().stream()
.sorted(Map.Entry.<SetPieceType, Double>comparingByValue().reversed())
.forEach(entry -> {
int goals = setPieceGoals.get(entry.getKey());
System.out.printf(" %s: %d球 (占比 %.2f%%)%n",
entry.getKey().getChineseName(),
goals,
entry.getValue());
});
// 计算定位球总占比
double totalSetPiecePercentage = percentages.values().stream()
.mapToDouble(Double::doubleValue)
.sum();
System.out.printf("%n定位球总得分占比: %.2f%%%n", totalSetPiecePercentage);
}
}
public static void main(String[] args) {
// 创建统计数据对象
StatsData stats = new StatsData();
// 模拟一场比赛的数据(这里以某支球队为例)
// 假设这支球队进了10个球
stats.addGoal(new Goal("张三", SetPieceType.PENALTY, 12));
stats.addGoal(new Goal("李四", SetPieceType.FREE_KICK, 25));
stats.addGoal(new Goal("王五", SetPieceType.CORNER_KICK, 34));
stats.addGoal(new Goal("赵六", SetPieceType.OTHER, 41)); // 运动战进球
stats.addGoal(new Goal("孙七", SetPieceType.PENALTY, 56));
stats.addGoal(new Goal("周八", SetPieceType.CORNER_KICK, 63));
stats.addGoal(new Goal("吴九", SetPieceType.OTHER, 72)); // 反击进球
stats.addGoal(new Goal("郑十", SetPieceType.FREE_KICK, 78));
stats.addGoal(new Goal("钱十一", SetPieceType.THROW_IN, 85));
stats.addGoal(new Goal("孙十二", SetPieceType.OTHER, 90)); // 补时进球
// 输出统计报告
stats.printReport();
// 额外功能:分析特定时间段
System.out.println("\n=========== 时间段分析 ===========");
analyzeTimePeriods(stats.allGoals);
}
// 分析不同时间段的进球分布
private static void analyzeTimePeriods(List<Goal> goals) {
Map<String, Integer> timeStats = new HashMap<>();
for (Goal goal : goals) {
String period = getTimePeriod(goal.getMinute());
timeStats.merge(period, 1, Integer::sum);
}
timeStats.forEach((period, count) ->
System.out.printf("%s: %d球%n", period, count));
}
private static String getTimePeriod(int minute) {
if (minute <= 15) return "1-15分钟(开场)";
else if (minute <= 30) return "16-30分钟";
else if (minute <= 45) return "31-45分钟(上半场结束)";
else if (minute <= 60) return "46-60分钟";
else if (minute <= 75) return "61-75分钟";
else if (minute <= 90) return "76-90分钟(比赛结束)";
else return "补时阶段";
}
}
运行结果示例
=========== 进球统计报告 ===========
总进球数: 10球
-----------------------------------
详细进球记录:
[12分钟] 张三 - 点球进球
[25分钟] 李四 - 任意球进球
[34分钟] 王五 - 角球进球
[41分钟] 赵六 - 其他进球
[56分钟] 孙七 - 点球进球
[63分钟] 周八 - 角球进球
[72分钟] 吴九 - 其他进球
[78分钟] 郑十 - 任意球进球
[85分钟] 钱十一 - 界外球进球
[90分钟] 孙十二 - 其他进球
-----------------------------------
定位球得分占比分析:
任意球: 2球 (占比 20.00%)
角球: 2球 (占比 20.00%)
点球: 2球 (占比 20.00%)
界外球: 1球 (占比 10.00%)
定位球总得分占比: 70.00%
=========== 时间段分析 ===========
1-15分钟(开场): 1球
16-30分钟: 1球
31-45分钟(上半场结束): 1球
46-60分钟: 1球
61-75分钟: 1球
76-90分钟(比赛结束): 5球
功能说明
- 定位球类型分类:任意球、角球、点球、界外球
- 统计功能:
- 总进球数统计
- 各定位球类型进球数
- 各类型得分占比
- 定位球总得分占比
- 附加分析:
- 按时间段分析进球分布
- 详细进球记录展示
使用建议
- 可以修改
main方法中的模拟数据来测试不同场景 - 可以扩展支持更多定位球类型(如中场开球等)
- 可以添加团队对比功能
- 可以结合数据库或文件存储保存历史数据
这个案例可以用于足球数据分析、比赛复盘或教学示例等场景。