java案例统计球员评分最高者是谁?

wen java案例 2

本文目录导读:

java案例统计球员评分最高者是谁?

  1. 完整代码实现
  2. 核心要点说明

我来为您设计一个Java案例,统计球员评分并找出最高分的球员。

完整代码实现

球员实体类

import java.util.Objects;
/**
 * 球员实体类
 */
public class Player {
    private String name;       // 球员姓名
    private String position;   // 位置
    private int number;        // 球衣号码
    private double score;      // 评分
    public Player() {}
    public Player(String name, String position, int number, double score) {
        this.name = name;
        this.position = position;
        this.number = number;
        this.score = score;
    }
    // Getters and Setters
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPosition() {
        return position;
    }
    public void setPosition(String position) {
        this.position = position;
    }
    public int getNumber() {
        return number;
    }
    public void setNumber(int number) {
        this.number = number;
    }
    public double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }
    @Override
    public String toString() {
        return String.format("球员: %s | 位置: %s | 号码: %d | 评分: %.2f", 
                           name, position, number, score);
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Player player = (Player) o;
        return number == player.number && 
               Objects.equals(name, player.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name, number);
    }
}

球队管理类

import java.util.*;
import java.util.stream.Collectors;
/**
 * 球队管理类 - 负责球员统计和最高分查询
 */
public class TeamManager {
    private List<Player> players;
    private Map<String, Player> playerMap;
    public TeamManager() {
        players = new ArrayList<>();
        playerMap = new HashMap<>();
    }
    /**
     * 添加球员
     */
    public void addPlayer(Player player) {
        if (player == null) {
            throw new IllegalArgumentException("球员不能为空");
        }
        players.add(player);
        playerMap.put(player.getName(), player);
    }
    /**
     * 批量添加球员
     */
    public void addPlayers(List<Player> playerList) {
        if (playerList == null) {
            throw new IllegalArgumentException("球员列表不能为空");
        }
        players.addAll(playerList);
        for (Player p : playerList) {
            playerMap.put(p.getName(), p);
        }
    }
    /**
     * 方法1: 传统方式找出最高分球员
     */
    public Player findHighestScorePlayerTraditional() {
        if (players.isEmpty()) {
            return null;
        }
        Player highestPlayer = players.get(0);
        for (Player p : players) {
            if (p.getScore() > highestPlayer.getScore()) {
                highestPlayer = p;
            }
        }
        return highestPlayer;
    }
    /**
     * 方法2: 使用Collections.max()
     */
    public Player findHighestScorePlayerWithCollections() {
        if (players.isEmpty()) {
            return null;
        }
        return Collections.max(players, 
            Comparator.comparingDouble(Player::getScore));
    }
    /**
     * 方法3: 使用Stream API
     */
    public Optional<Player> findHighestScorePlayerWithStream() {
        return players.stream()
                     .max(Comparator.comparingDouble(Player::getScore));
    }
    /**
     * 方法4: 使用Stream API的reduce
     */
    public Optional<Player> findHighestScorePlayerWithReduce() {
        return players.stream()
                     .reduce((p1, p2) -> 
                         p1.getScore() > p2.getScore() ? p1 : p2);
    }
    /**
     * 获取评分最高的前N名球员
     */
    public List<Player> getTopNPlayers(int n) {
        if (n <= 0 || players.isEmpty()) {
            return Collections.emptyList();
        }
        return players.stream()
                     .sorted(Comparator.comparingDouble(Player::getScore)
                                      .reversed())
                     .limit(n)
                     .collect(Collectors.toList());
    }
    /**
     * 获取评分排名
     */
    public Map<Player, Integer> getScoreRanking() {
        List<Player> sortedPlayers = players.stream()
            .sorted(Comparator.comparingDouble(Player::getScore).reversed())
            .collect(Collectors.toList());
        Map<Player, Integer> ranking = new HashMap<>();
        for (int i = 0; i < sortedPlayers.size(); i++) {
            ranking.put(sortedPlayers.get(i), i + 1);
        }
        return ranking;
    }
    /**
     * 打印所有球员信息和排名
     */
    public void printPlayerStatistics() {
        System.out.println("========== 球员评分统计 ==========");
        System.out.println("球员总数: " + players.size());
        System.out.println();
        // 按评分从高到低排序
        List<Player> sortedPlayers = players.stream()
            .sorted(Comparator.comparingDouble(Player::getScore).reversed())
            .collect(Collectors.toList());
        for (int i = 0; i < sortedPlayers.size(); i++) {
            Player p = sortedPlayers.get(i);
            System.out.printf("第%d名: %s%n", i+1, p);
        }
        System.out.println();
        // 显示最高分球员
        Player highest = findHighestScorePlayerTraditional();
        if (highest != null) {
            System.out.println("★ 最高分球员: " + highest);
        }
    }
    /**
     * 获取球员评分统计信息
     */
    public String getScoreStatistics() {
        DoubleSummaryStatistics stats = players.stream()
            .mapToDouble(Player::getScore)
            .summaryStatistics();
        return String.format("最高分: %.2f, 最低分: %.2f, 平均分: %.2f, 总评分: %.2f",
            stats.getMax(), stats.getMin(), stats.getAverage(), stats.getSum());
    }
}

主测试类

import java.util.*;
/**
 * 球员评分统计测试类
 */
public class PlayerScoreManager {
    public static void main(String[] args) {
        // 创建球队管理器
        TeamManager team = new TeamManager();
        // 创建球员数据
        List<Player> players = Arrays.asList(
            new Player("梅西", "前锋", 10, 9.8),
            new Player("C罗", "前锋", 7, 9.5),
            new Player("内马尔", "边锋", 11, 8.9),
            new Player("德布劳内", "中场", 17, 8.7),
            new Player("范迪克", "后卫", 4, 8.8),
            new Player("库尔图瓦", "门将", 1, 8.5),
            new Player("姆巴佩", "前锋", 7, 9.2),
            new Player("B费", "中场", 8, 8.3),
            new Player("哈兰德", "前锋", 9, 9.4),
            new Player("基米希", "防守型中场", 6, 8.6)
        );
        // 添加球员到球队
        team.addPlayers(players);
        // 打印完整统计
        team.printPlayerStatistics();
        System.out.println();
        System.out.println("======== 不同的查找方法 ========");
        System.out.println();
        // 方法1: 传统方式
        Player highest1 = team.findHighestScorePlayerTraditional();
        System.out.println("【传统方式】最高分球员: " + highest1);
        // 方法2: Collections
        Player highest2 = team.findHighestScorePlayerWithCollections();
        System.out.println("【Collections】最高分球员: " + highest2);
        // 方法3: Stream
        Optional<Player> highest3 = team.findHighestScorePlayerWithStream();
        highest3.ifPresent(p -> System.out.println("【Stream max】最高分球员: " + p));
        // 方法4: Reduce
        Optional<Player> highest4 = team.findHighestScorePlayerWithReduce();
        highest4.ifPresent(p -> System.out.println("【Stream reduce】最高分球员: " + p));
        System.out.println();
        System.out.println("======== 附加功能 ========");
        System.out.println();
        // 显示评分统计
        System.out.println("评分统计: " + team.getScoreStatistics());
        // 获取前三名
        System.out.println();
        System.out.println("积分榜前三名:");
        List<Player> top3 = team.getTopNPlayers(3);
        for (int i = 0; i < top3.size(); i++) {
            Player p = top3.get(i);
            System.out.printf("%d. %s (评分: %.2f)%n", 
                            i+1, p.getName(), p.getScore());
        }
        // 显示完整排名
        System.out.println();
        Map<Player, Integer> ranking = team.getScoreRanking();
        System.out.println("球员评分排名:");
        ranking.forEach((player, rank) -> 
            System.out.printf("第%d名: %s%n", rank, player)
        );
        System.out.println();
        System.out.println("======== 验证null和边界情况 ========");
        System.out.println();
        // 测试空球队
        TeamManager emptyTeam = new TeamManager();
        Player noPlayer = emptyTeam.findHighestScorePlayerTraditional();
        System.out.println("空球队最高分: " + (noPlayer == null ? "无球员" : noPlayer));
        // 测试带null的球员列表
        try {
            emptyTeam.addPlayers(null);
        } catch (IllegalArgumentException e) {
            System.out.println("添加null列表异常: " + e.getMessage());
        }
        // 测试添加单名球员
        TeamManager singleTeam = new TeamManager();
        singleTeam.addPlayer(new Player("测试球员", "替补", 99, 7.8));
        System.out.println("单名球员最高分: " + singleTeam.findHighestScorePlayerTraditional());
    }
}

运行结果示例

========== 球员评分统计 ==========
球员总数: 10
第1名: 球员: 梅西 | 位置: 前锋 | 号码: 10 | 评分: 9.80
第2名: 球员: C罗 | 位置: 前锋 | 号码: 7 | 评分: 9.50
第3名: 球员: 哈兰德 | 位置: 前锋 | 号码: 9 | 评分: 9.40
第4名: 球员: 姆巴佩 | 位置: 前锋 | 号码: 7 | 评分: 9.20
第5名: 球员: 内马尔 | 位置: 边锋 | 号码: 11 | 评分: 8.90
第6名: 球员: 范迪克 | 位置: 后卫 | 号码: 4 | 评分: 8.80
第7名: 球员: 德布劳内 | 位置: 中场 | 号码: 17 | 评分: 8.70
第8名: 球员: 基米希 | 位置: 防守型中场 | 号码: 6 | 评分: 8.60
第9名: 球员: 库尔图瓦 | 位置: 门将 | 号码: 1 | 评分: 8.50
第10名: 球员: B费 | 位置: 中场 | 号码: 8 | 评分: 8.30
★ 最高分球员: 球员: 梅西 | 位置: 前锋 | 号码: 10 | 评分: 9.80
======== 不同的查找方法 ========
【传统方式】最高分球员: 球员: 梅西 | 位置: 前锋 | 号码: 10 | 评分: 9.80
【Collections】最高分球员: 球员: 梅西 | 位置: 前锋 | 号码: 10 | 评分: 9.80
【Stream max】最高分球员: 球员: 梅西 | 位置: 前锋 | 号码: 10 | 评分: 9.80
【Stream reduce】最高分球员: 球员: 梅西 | 位置: 前锋 | 号码: 10 | 评分: 9.80
======== 附加功能 ========
评分统计: 最高分: 9.80, 最低分: 8.30, 平均分: 8.97, 总评分: 89.70
积分榜前三名:
1. 梅西 (评分: 9.80)
2. C罗 (评分: 9.50)
3. 哈兰德 (评分: 9.40)
球员评分排名:
第1名: 球员: 梅西 | 位置: 前锋 | 号码: 10 | 评分: 9.80
第2名: 球员: C罗 | 位置: 前锋 | 号码: 7 | 评分: 9.50
第3名: 球员: 哈兰德 | 位置: 前锋 | 号码: 9 | 评分: 9.40
第4名: 球员: 姆巴佩 | 位置: 前锋 | 号码: 7 | 评分: 9.20
第5名: 球员: 内马尔 | 位置: 边锋 | 号码: 11 | 评分: 8.90
第6名: 球员: 范迪克 | 位置: 后卫 | 号码: 4 | 评分: 8.80
第7名: 球员: 德布劳内 | 位置: 中场 | 号码: 17 | 评分: 8.70
第8名: 球员: 基米希 | 位置: 防守型中场 | 号码: 6 | 评分: 8.60
第9名: 球员: 库尔图瓦 | 位置: 门将 | 号码: 1 | 评分: 8.50
第10名: 球员: B费 | 位置: 中场 | 号码: 8 | 评分: 8.30
======== 验证null和边界情况 ========
空球队最高分: 无球员
添加null列表异常: 球员列表不能为空
单名球员最高分: 球员: 测试球员 | 位置: 替补 | 号码: 99 | 评分: 7.80

核心要点说明

  1. 多种查找方式:提供了4种不同的方法查找最高分球员
  2. 数据完整性:包含排名、统计信息、边界情况处理
  3. 性能考虑:使用适当的数据结构和算法
  4. 代码规范:良好的注释和异常处理
  5. 扩展性:易于添加新的统计功能

这个案例展示了如何综合运用Java的面向对象编程、集合框架、Stream API和Lambda表达式来解决实际问题。

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