java案例统计传球成功率哪队更高?

wen java案例 3

本文目录导读:

java案例统计传球成功率哪队更高?

  1. 完整代码实现
  2. 第二种实现方式:使用Map和Lambda表达式
  3. 主要功能说明
  4. 运行结果示例

我来提供一个Java案例,统计两支球队的传球成功率并比较哪队更高。

完整代码实现

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
 * 传球成功率统计案例
 * 用于比较两支球队的传球成功率
 */
public class PassSuccessRate {
    // 球队类
    static class Team {
        private String name;
        private List<Player> players;
        public Team(String name) {
            this.name = name;
            this.players = new ArrayList<>();
        }
        public void addPlayer(Player player) {
            players.add(player);
        }
        public String getName() {
            return name;
        }
        public List<Player> getPlayers() {
            return players;
        }
    }
    // 球员类
    static class Player {
        private String name;
        private int totalPasses;      // 总传球次数
        private int successfulPasses; // 成功传球次数
        public Player(String name, int totalPasses, int successfulPasses) {
            this.name = name;
            this.totalPasses = totalPasses;
            this.successfulPasses = successfulPasses;
        }
        public int getTotalPasses() {
            return totalPasses;
        }
        public int getSuccessfulPasses() {
            return successfulPasses;
        }
        public double getSuccessRate() {
            if (totalPasses == 0) return 0;
            return (double) successfulPasses / totalPasses * 100;
        }
        public String getName() {
            return name;
        }
    }
    // 统计工具类
    static class Statistics {
        /**
         * 计算球队的传球成功率
         */
        public static double calculateTeamSuccessRate(Team team) {
            int totalPasses = 0;
            int successfulPasses = 0;
            for (Player player : team.getPlayers()) {
                totalPasses += player.getTotalPasses();
                successfulPasses += player.getSuccessfulPasses();
            }
            if (totalPasses == 0) return 0;
            return (double) successfulPasses / totalPasses * 100;
        }
        /**
         * 显示球队统计数据
         */
        public static void displayTeamStats(Team team) {
            System.out.println("\n=== " + team.getName() + " 统计 ===");
            System.out.println("球员\t\t总传球\t成功传球\t成功率");
            System.out.println("----------------------------------------");
            int teamTotal = 0;
            int teamSuccessful = 0;
            for (Player player : team.getPlayers()) {
                System.out.printf("%-10s\t%6d\t%6d\t\t%.1f%%\n",
                        player.getName(),
                        player.getTotalPasses(),
                        player.getSuccessfulPasses(),
                        player.getSuccessRate());
                teamTotal += player.getTotalPasses();
                teamSuccessful += player.getSuccessfulPasses();
            }
            System.out.println("----------------------------------------");
            System.out.printf("球队合计\t%6d\t%6d\t\t%.1f%%\n",
                    teamTotal, teamSuccessful,
                    calculateTeamSuccessRate(team));
        }
        /**
         * 比较两队的传球成功率
         */
        public static void compareTeams(Team team1, Team team2) {
            double rate1 = calculateTeamSuccessRate(team1);
            double rate2 = calculateTeamSuccessRate(team2);
            System.out.println("\n=== 比较结果 ===");
            System.out.printf("%s 传球成功率: %.2f%%\n", team1.getName(), rate1);
            System.out.printf("%s 传球成功率: %.2f%%\n", team2.getName(), rate2);
            if (rate1 > rate2) {
                System.out.printf(">>> %s 的传球成功率更高!\n", team1.getName());
            } else if (rate2 > rate1) {
                System.out.printf(">>> %s 的传球成功率更高!\n", team2.getName());
            } else {
                System.out.println(">>> 两队传球成功率相同!");
            }
        }
    }
    // 主方法 - 测试示例
    public static void main(String[] args) {
        System.out.println("=== 足球传球成功率统计系统 ===\n");
        // 创建两支球队
        Team teamA = createTeamA();
        Team teamB = createTeamB();
        // 显示统计信息
        Statistics.displayTeamStats(teamA);
        Statistics.displayTeamStats(teamB);
        // 比较两队成功率
        Statistics.compareTeams(teamA, teamB);
        // 添加交互式示例
        interactiveExample();
    }
    /**
     * 创建A队
     */
    private static Team createTeamA() {
        Team team = new Team("A队");
        team.addPlayer(new Player("张三", 58, 45));
        team.addPlayer(new Player("李四", 62, 50));
        team.addPlayer(new Player("王五", 45, 38));
        team.addPlayer(new Player("赵六", 55, 48));
        team.addPlayer(new Player("孙七", 40, 35));
        return team;
    }
    /**
     * 创建B队
     */
    private static Team createTeamB() {
        Team team = new Team("B队");
        team.addPlayer(new Player("周八", 50, 40));
        team.addPlayer(new Player("吴九", 65, 52));
        team.addPlayer(new Player("郑十", 48, 39));
        team.addPlayer(new Player("钱一", 60, 41));
        team.addPlayer(new Player("陈二", 35, 25));
        return team;
    }
    /**
     * 交互式示例 - 动态输入数据
     */
    private static void interactiveExample() {
        System.out.println("\n\n=== 交互式测试示例 ===");
        System.out.println("以下为随机生成的测试数据:");
        Random random = new Random();
        // 动态创建球队
        Team team1 = new Team("红队");
        Team team2 = new Team("蓝队");
        // 为红队添加球员数据
        for (int i = 1; i <= 4; i++) {
            int total = 30 + random.nextInt(40); // 30-69次传球
            int success = total - random.nextInt(10); // 成功数
            team1.addPlayer(new Player("红队球员" + i, total, success));
        }
        // 为蓝队添加球员数据
        for (int i = 1; i <= 4; i++) {
            int total = 30 + random.nextInt(40);
            int success = total - random.nextInt(15); // 稍微加点难度
            team2.addPlayer(new Player("蓝队球员" + i, total, success));
        }
        // 显示并比较
        Statistics.displayTeamStats(team1);
        Statistics.displayTeamStats(team2);
        Statistics.compareTeams(team1, team2);
    }
}

第二种实现方式:使用Map和Lambda表达式

import java.util.*;
import java.util.stream.Collectors;
/**
 * 使用现代Java特性实现的传球统计
 */
public class PassStatsModern {
    static class Player {
        String name;
        int totalPasses;
        int successfulPasses;
        Player(String name, int total, int success) {
            this.name = name;
            this.totalPasses = total;
            this.successfulPasses = success;
        }
        double getSuccessRate() {
            return totalPasses == 0 ? 0 : (double) successfulPasses / totalPasses * 100;
        }
    }
    public static void main(String[] args) {
        // 使用Map存储球队数据
        Map<String, List<Player>> teams = new HashMap<>();
        // 添加球队数据
        teams.put("球队A", Arrays.asList(
            new Player("球员1", 55, 48),
            new Player("球员2", 48, 42),
            new Player("球员3", 60, 55)
        ));
        teams.put("球队B", Arrays.asList(
            new Player("球员4", 50, 40),
            new Player("球员5", 65, 49),
            new Player("球员6", 42, 35)
        ));
        // 计算每队的成功率
        Map<String, Double> teamRates = teams.entrySet().stream()
            .collect(Collectors.toMap(
                Map.Entry::getKey,
                entry -> {
                    int total = entry.getValue().stream()
                        .mapToInt(p -> p.totalPasses).sum();
                    int success = entry.getValue().stream()
                        .mapToInt(p -> p.successfulPasses).sum();
                    return total == 0 ? 0 : (double) success / total * 100;
                }
            ));
        // 找出最高成功率的球队
        String bestTeam = teamRates.entrySet().stream()
            .max(Map.Entry.comparingByValue())
            .map(Map.Entry::getKey)
            .orElse("无");
        // 输出结果
        teamRates.forEach((team, rate) -> 
            System.out.printf("%s 成功率: %.1f%%\n", team, rate));
        System.out.printf("\n成功率最高的球队是: %s (%.1f%%)",
            bestTeam, teamRates.get(bestTeam));
    }
}

主要功能说明

  1. 数据类设计:包含Team(球队)和Player(球员)类
  2. 统计功能:计算个人和球队的传球成功率
  3. 比较功能:比较不同球队的成功率高低
  4. 显示功能:格式化显示统计数据和比较结果

运行结果示例

=== 足球传球成功率统计系统 ===
=== A队 统计 ===
球员      总传球 成功传球    成功率
----------------------------------------
张三        58        45      77.6%
李四        62        50      80.6%
王五        45        38      84.4%
赵六        55        48      87.3%
孙七        40        35      87.5%
----------------------------------------
球队合计     260      216       83.1%
=== B队 统计 ===
球员      总传球 成功传球    成功率
----------------------------------------
周八        50        40      80.0%
吴九        65        52      80.0%
郑十        48        39      81.3%
钱一        60        41      68.3%
陈二        35        25      71.4%
----------------------------------------
球队合计     258      197       76.4%
=== 比较结果 ===
A队 传球成功率: 83.08%
B队 传球成功率: 76.36%
>>> A队 的传球成功率更高!

这个案例提供了完整的解决方案,包含了面向对象设计和现代Java特性两种实现方式,可以根据需求选择使用。

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