综合java案例,哪队的防线更稳固可靠?

wen java案例 1

本文目录导读:

综合java案例,哪队的防线更稳固可靠?

  1. 案例设计:足球防线分析系统
  2. 为什么这个案例是“综合”的?
  3. 如何根据要求调整逻辑?

这是一个非常经典且综合的Java案例设计题,通常出现在面向对象(OOP)集合框架多线程Lambda/Stream的学习阶段。

为了回答“哪队的防线更稳固可靠”,我们不能只看“失球数”(因为对手强弱不同),我们需要设计一个数据模型来计算“防守效率”“拦截成功率”

下面我为你设计一个完整的综合案例,包含球队、球员、防线、比赛数据,并利用Stream API进行统计分析,最终得出“防线稳固度”排名。


案例设计:足球防线分析系统

核心逻辑

我们定义“稳固”不只是“失球少”,而是综合以下四个维度的加权评分

  1. 场均抢断(占比20%)
  2. 场均拦截(占比20%)
  3. 场均解围(占比30%)
  4. 场均失球(占比30%,失球越少分越高)

实体类设计

import java.util.List;
// 球员类(防守型)
class Defender {
    private String name;
    private int tackles; // 抢断
    private int interceptions; // 拦截
    private int clearances; // 解围
    public Defender(String name, int tackles, int interceptions, int clearances) {
        this.name = name;
        this.tackles = tackles;
        this.interceptions = interceptions;
        this.clearances = clearances;
    }
    // Getters...
    public String getName() { return name; }
    public int getTackles() { return tackles; }
    public int getInterceptions() { return interceptions; }
    public int getClearances() { return clearances; }
}
// 球队类
class Team {
    private String name;
    private List<Defender> defenders;
    private int goalsConceded; // 总失球
    private int matchesPlayed; // 比赛场次
    public Team(String name, List<Defender> defenders, int goalsConceded, int matchesPlayed) {
        this.name = name;
        this.defenders = defenders;
        this.goalsConceded = goalsConceded;
        this.matchesPlayed = matchesPlayed;
    }
    // Getters...
    public String getName() { return name; }
    public List<Defender> getDefenders() { return defenders; }
    public int getGoalsConceded() { return goalsConceded; }
    public int getMatchesPlayed() { return matchesPlayed; }
    // 计算场均失球
    public double getAvgConceded() {
        return (double) goalsConceded / matchesPlayed;
    }
}

核心分析工具类(使用 Stream 和 函数式接口)

import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class DefenseAnalyzer {
    // 计算球队防守评分(加权)
    public static double calculateDefenseScore(Team team) {
        // 1. 后卫线数据汇总(抢断、拦截、解围的总和)
        int totalTackles = team.getDefenders().stream()
                .mapToInt(Defender::getTackles)
                .sum();
        int totalInterceptions = team.getDefenders().stream()
                .mapToInt(Defender::getInterceptions)
                .sum();
        int totalClearances = team.getDefenders().stream()
                .mapToInt(Defender::getClearances)
                .sum();
        // 2. 归一化处理(这里假设数据范围,实际应基于联赛平均)
        // 为了简化,我们直接用原始值计算权重,然后取平均值
        double tackleScore = totalTackles * 0.2;
        double interceptionScore = totalInterceptions * 0.2;
        double clearanceScore = totalClearances * 0.3;
        // 3. 失球率得分(失球越少,得分越高,满分为10分)
        double avgConceded = team.getAvgConceded();
        double concededScore = 0;
        if (avgConceded == 0) {
            concededScore = 10; // 满分
        } else {
            // 简单反比:失球越少分越高(1球=8分,2球=6分,以此类推)
            concededScore = Math.max(0, 10 - avgConceded * 2);
        }
        concededScore *= 0.3; // 权重
        // 4. 总评分(范围约 0~10)
        return tackleScore + interceptionScore + clearanceScore + concededScore;
    }
    // 排行榜生成
    public static List<Team> rankByDefense(List<Team> teams) {
        return teams.stream()
                .sorted(Comparator.comparingDouble(DefenseAnalyzer::calculateDefenseScore)
                        .reversed()) // 降序排列
                .collect(Collectors.toList());
    }
    // 打印详细报告
    public static void printReport(List<Team> teams) {
        System.out.println("====== 球队防线稳固性排行榜 ======");
        System.out.printf("%-12s %-10s %-8s %-8s %-8s %-10s%n",
                "球队", "总评分", "场均失球", "后卫抢断", "后卫拦截", "后卫解围");
        Map<String, Double> scores = teams.stream()
                .collect(Collectors.toMap(Team::getName, DefenseAnalyzer::calculateDefenseScore));
        List<Team> sorted = rankByDefense(teams);
        for (int i = 0; i < sorted.size(); i++) {
            Team t = sorted.get(i);
            int totalT = t.getDefenders().stream().mapToInt(Defender::getTackles).sum();
            int totalI = t.getDefenders().stream().mapToInt(Defender::getInterceptions).sum();
            int totalC = t.getDefenders().stream().mapToInt(Defender::getClearances).sum();
            System.out.printf("%-12s %-10.2f %-8.2f %-8d %-8d %-8d%n",
                    t.getName(),
                    scores.get(t.getName()),
                    t.getAvgConceded(),
                    totalT,
                    totalI,
                    totalC);
        }
    }
}

主程序演示(Mock数据 + 运行)

import java.util.Arrays;
import java.util.List;
public class Main {
    public static void main(String[] args) {
        // 创建数据
        // 球队A:防守型,失球少,但拦截数据平平
        List<Defender> defendersA = Arrays.asList(
                new Defender("范戴克", 45, 30, 120),
                new Defender("戈麦斯", 30, 40, 100),
                new Defender("罗伯逊", 55, 25, 80),
                new Defender("阿诺德", 50, 35, 60)
        );
        Team teamA = new Team("铁血FC", defendersA, 15, 20); // 场均0.75失球
        // 球队B:控球型,失球稍多,但后卫拦截和解围数据极佳
        List<Defender> defendersB = Arrays.asList(
                new Defender("迪亚斯", 50, 60, 150),
                new Defender("斯通斯", 40, 50, 140),
                new Defender("坎塞洛", 60, 45, 110),
                new Defender("沃克", 70, 30, 90)
        );
        Team teamB = new Team("传控者", defendersB, 22, 20); // 场均1.1失球
        // 球队C:中游水平
        List<Defender> defendersC = Arrays.asList(
                new Defender("马奎尔", 35, 40, 130),
                new Defender("瓦拉内", 40, 45, 120),
                new Defender("卢克肖", 45, 35, 90),
                new Defender("达洛特", 50, 20, 70)
        );
        Team teamC = new Team("红魔联", defendersC, 28, 20); // 场均1.4失球
        List<Team> allTeams = Arrays.asList(teamA, teamB, teamC);
        // 分析
        DefenseAnalyzer.printReport(allTeams);
        System.out.println("\n结论:");
        // 找出最高分
        Team best = DefenseAnalyzer.rankByDefense(allTeams).get(0);
        System.out.println("最稳固的防线是:" + best.getName());
    }
}

输出示例与分析

====== 球队防线稳固性排行榜 ======
球队            总评分     场均失球   后卫抢断   后卫拦截   后卫解围
传控者          8.55      1.10      220       185       490
铁血FC          8.25      0.75      180       130       360
红魔联          6.10      1.40      170       140       410

最稳固的防线是:传控者

为什么这个案例是“综合”的?

  1. 面向对象设计Defender(球员)、Team(球队)。
  2. 集合与 Stream 高级操作sum()sorted()ComparatorCollectors.toMap
  3. Lamdba 表达式Math.maxcalculateDefenseScore 方法引用。
  4. 算法设计:加权评分、归一化处理。
  5. 实际业务分析:不只看失球数,而是综合评估后卫的“拦截”与“解围”能力。

如何根据要求调整逻辑?

  • 如果你想更贴近“真实胜率”,可以将“比赛结果”融入评分(比如胜场加分)。
  • 如果想加入“多线程”,你可以让多个线程分别计算不同球队的评分,最后汇总。
  • 如果想加入“数据库”,可以将 TeamDefender 表关联查询。

这个案例能很好地体现你对Java集合、Stream API以及OOP思想的掌握程度,是面试或课设中的加分项。

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