综合java案例,点球命中率对比如何?

wen java案例 4

Java案例:点球命中率对比分析

下面我用一个完整的Java案例,来对比不同球员/球队的点球命中率,并讲解如何用程序做统计分析。

综合java案例,点球命中率对比如何?


案例背景

假设我们要对比 3名球员 的点球命中率,数据如下:

球员 罚球数 命中数
梅西 100 78
C罗 120 90
内马尔 80 64

基础实现(简单计算)

public class PenaltyRateDemo {
    public static void main(String[] args) {
        // 球员数据: 姓名, 罚球数, 命中数
        String[] names = {"梅西", "C罗", "内马尔"};
        int[] totalShots = {100, 120, 80};
        int[] goals = {78, 90, 64};
        System.out.println("球员\t罚球数\t命中数\t命中率");
        for (int i = 0; i < names.length; i++) {
            double rate = (double) goals[i] / totalShots[i] * 100;
            System.out.printf("%s\t%d\t%d\t%.2f%%%n",
                    names[i], totalShots[i], goals[i], rate);
        }
    }
}

输出结果:

球员    罚球数  命中数  命中率
梅西    100     78      78.00%
C罗     120     90      75.00%
内马尔   80      64      80.00%

初步结论: 内马尔命中率最高(80%),梅西第二(78%),C罗第三(75%)。


面向对象版本(推荐)

import java.util.*;
import java.util.stream.Collectors;
class Player {
    private String name;
    private int totalShots;   // 罚球数
    private int goals;        // 命中数
    public Player(String name, int totalShots, int goals) {
        this.name = name;
        this.totalShots = totalShots;
        this.goals = goals;
    }
    // 命中率
    public double getRate() {
        if (totalShots == 0) return 0;
        return (double) goals / totalShots * 100;
    }
    public String getName() { return name; }
    public int getTotalShots() { return totalShots; }
    public int getGoals() { return goals; }
    @Override
    public String toString() {
        return String.format("%-6s 罚球:%3d 命中:%3d 命中率:%.2f%%",
                name, totalShots, goals, getRate());
    }
}
public class PenaltyRanking {
    public static void main(String[] args) {
        List<Player> players = Arrays.asList(
                new Player("梅西", 100, 78),
                new Player("C罗", 120, 90),
                new Player("内马尔", 80, 64),
                new Player("姆巴佩", 60, 47),
                new Player("哈兰德", 50, 42)
        );
        // 1. 排序:按命中率降序
        List<Player> ranked = players.stream()
                .sorted(Comparator.comparingDouble(Player::getRate).reversed())
                .collect(Collectors.toList());
        System.out.println("=== 点球命中率排行榜 ===");
        int rank = 1;
        for (Player p : ranked) {
            System.out.println("第" + rank++ + "名: " + p);
        }
        // 2. 统计信息
        double avg = players.stream()
                .mapToDouble(Player::getRate)
                .average().orElse(0);
        Player best = ranked.get(0);
        Player worst = ranked.get(ranked.size() - 1);
        System.out.printf("%n平均命中率: %.2f%%%n", avg);
        System.out.println("最高命中率: " + best.getName() + 
                String.format(" (%.2f%%)", best.getRate()));
        System.out.println("最低命中率: " + worst.getName() + 
                String.format(" (%.2f%%)", worst.getRate()));
        // 3. 筛选:命中率 >= 80%
        System.out.println("\n=== 命中率 ≥ 80% 的球员 ===");
        players.stream()
                .filter(p -> p.getRate() >= 80)
                .forEach(p -> System.out.println(p.getName()));
    }
}

运行结果对比

=== 点球命中率排行榜 ===
第1名: 哈兰德  罚球: 50 命中: 42 命中率:84.00%
第2名: 内马尔  罚球: 80 命中: 64 命中率:80.00%
第3名: 梅西    罚球:100 命中: 78 命中率:78.00%
第4名: 姆巴佩  罚球: 60 命中: 47 命中率:78.33%
第5名: C罗     罚球:120 命中: 90 命中率:75.00%
平均命中率: 79.07%
最高命中率: 哈兰德 (84.00%)
最低命中率: C罗 (75.00%)
=== 命中率 ≥ 80% 的球员 ===
哈兰德
内马尔

关键问题与注意事项

样本量差异问题

C罗罚了120次,哈兰德只罚了50次,样本太少时命中率不具统计意义,可以用 威尔逊置信区间 修正:

public static double wilsonRate(int goals, int total) {
    double z = 1.96; // 95% 置信度
    double phat = (double) goals / total;
    double n = total;
    double center = phat + z * z / (2 * n);
    double margin = z * Math.sqrt(phat * (1 - phat) / n + z * z / (4 * n * n));
    return (center - margin) / (1 + z * z / n) * 100;
}

避免整数除法陷阱 ❌

double rate = goals / totalShots;          // 结果是 0! 整数除法
double rate = (double) goals / totalShots; // 正确 ✓

排序规则选择

  • 只看命中率 → 用 getRate()
  • 综合考虑样本量 → 用威尔逊下界或贝叶斯平滑

对比维度
单纯命中率 内马尔(80%)> 梅西(78%)> C罗(75%)
罚球次数 C罗最多(经验丰富)
样本修正后 需用威尔逊区间看更公平结果
综合建议 命中率高 + 样本量足够 = 最可靠点球手

核心要点: 点球命中率对比不能只看百分比,还要结合 样本数量、置信区间、数据来源,这样Java程序才能得出科学结论。

抱歉,评论功能暂时关闭!