本文目录导读:

我来为您提供一个Java案例,展示赛季累计数据对比的功能实现,这个案例将包含球队/球员赛季数据的统计和对比分析。
基础数据模型
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
// 比赛数据模型
class MatchData {
private LocalDate date;
private String opponent;
private int points;
private int rebounds;
private int assists;
private int steals;
private int blocks;
private int turnovers;
private int minutes;
private boolean isHome;
private boolean isWin;
public MatchData(LocalDate date, String opponent, int points, int rebounds,
int assists, int steals, int blocks, int turnovers,
int minutes, boolean isHome, boolean isWin) {
this.date = date;
this.opponent = opponent;
this.points = points;
this.rebounds = rebounds;
this.assists = assists;
this.steals = steals;
this.blocks = blocks;
this.turnovers = turnovers;
this.minutes = minutes;
this.isHome = isHome;
this.isWin = isWin;
}
// Getters and Setters
public LocalDate getDate() { return date; }
public String getOpponent() { return opponent; }
public int getPoints() { return points; }
public int getRebounds() { return rebounds; }
public int getAssists() { return assists; }
public int getSteals() { return steals; }
public int getBlocks() { return blocks; }
public int getTurnovers() { return turnovers; }
public int getMinutes() { return minutes; }
public boolean isHome() { return isHome; }
public boolean isWin() { return isWin; }
}
// 赛季统计汇总类
class SeasonStats {
private String season;
private int gamesPlayed;
private int wins;
private int losses;
private double avgPoints;
private double avgRebounds;
private double avgAssists;
private double avgSteals;
private double avgBlocks;
private double avgTurnovers;
private double avgMinutes;
private double fieldGoalPercentage;
private double threePointPercentage;
// 构造函数和getter/setter
public SeasonStats(String season) {
this.season = season;
}
// Getters and Setters
public String getSeason() { return season; }
public int getGamesPlayed() { return gamesPlayed; }
public int getWins() { return wins; }
public int getLosses() { return losses; }
public double getAvgPoints() { return avgPoints; }
public double getAvgRebounds() { return avgRebounds; }
public double getAvgAssists() { return avgAssists; }
public double getAvgSteals() { return avgSteals; }
public double getAvgBlocks() { return avgBlocks; }
public double getAvgTurnovers() { return avgTurnovers; }
public double getAvgMinutes() { return avgMinutes; }
public double getFieldGoalPercentage() { return fieldGoalPercentage; }
public double getThreePointPercentage() { return threePointPercentage; }
public void setGamesPlayed(int gamesPlayed) { this.gamesPlayed = gamesPlayed; }
public void setWins(int wins) { this.wins = wins; }
public void setLosses(int losses) { this.losses = losses; }
public void setAvgPoints(double avgPoints) { this.avgPoints = avgPoints; }
public void setAvgRebounds(double avgRebounds) { this.avgRebounds = avgRebounds; }
public void setAvgAssists(double avgAssists) { this.avgAssists = avgAssists; }
public void setAvgSteals(double avgSteals) { this.avgSteals = avgSteals; }
public void setAvgBlocks(double avgBlocks) { this.avgBlocks = avgBlocks; }
public void setAvgTurnovers(double avgTurnovers) { this.avgTurnovers = avgTurnovers; }
public void setAvgMinutes(double avgMinutes) { this.avgMinutes = avgMinutes; }
public void setFieldGoalPercentage(double fieldGoalPercentage) { this.fieldGoalPercentage = fieldGoalPercentage; }
public void setThreePointPercentage(double threePointPercentage) { this.threePointPercentage = threePointPercentage; }
}
// 球员类
class Player {
private String name;
private String team;
private String position;
private List<MatchData> matches;
public Player(String name, String team, String position) {
this.name = name;
this.team = team;
this.position = position;
this.matches = new ArrayList<>();
}
public void addMatch(MatchData match) {
matches.add(match);
}
public List<MatchData> getMatches() { return matches; }
public String getName() { return name; }
public String getTeam() { return team; }
public String getPosition() { return position; }
}
统计服务类
// 统计服务类
class SeasonStatsService {
// 计算赛季累计数据
public SeasonStats calculateSeasonStats(List<MatchData> matches, String season) {
SeasonStats stats = new SeasonStats(season);
if (matches.isEmpty()) {
return stats;
}
int totalPoints = 0;
int totalRebounds = 0;
int totalAssists = 0;
int totalSteals = 0;
int totalBlocks = 0;
int totalTurnovers = 0;
int totalMinutes = 0;
int wins = 0;
for (MatchData match : matches) {
totalPoints += match.getPoints();
totalRebounds += match.getRebounds();
totalAssists += match.getAssists();
totalSteals += match.getSteals();
totalBlocks += match.getBlocks();
totalTurnovers += match.getTurnovers();
totalMinutes += match.getMinutes();
if (match.isWin()) {
wins++;
}
}
int games = matches.size();
stats.setGamesPlayed(games);
stats.setWins(wins);
stats.setLosses(games - wins);
stats.setAvgPoints(roundToTwo(totalPoints / (double) games));
stats.setAvgRebounds(roundToTwo(totalRebounds / (double) games));
stats.setAvgAssists(roundToTwo(totalAssists / (double) games));
stats.setAvgSteals(roundToTwo(totalSteals / (double) games));
stats.setAvgBlocks(roundToTwo(totalBlocks / (double) games));
stats.setAvgTurnovers(roundToTwo(totalTurnovers / (double) games));
stats.setAvgMinutes(roundToTwo(totalMinutes / (double) games));
return stats;
}
// 对比两个赛季的数据
public Map<String, Double> compareSeasons(SeasonStats season1, SeasonStats season2) {
Map<String, Double> differences = new HashMap<>();
differences.put("gamesPlayedDiff", (double)(season2.getGamesPlayed() - season1.getGamesPlayed()));
differences.put("winsDiff", (double)(season2.getWins() - season1.getWins()));
differences.put("lossesDiff", (double)(season2.getLosses() - season1.getLosses()));
differences.put("avgPointsDiff", roundToTwo(season2.getAvgPoints() - season1.getAvgPoints()));
differences.put("avgReboundsDiff", roundToTwo(season2.getAvgRebounds() - season1.getAvgRebounds()));
differences.put("avgAssistsDiff", roundToTwo(season2.getAvgAssists() - season1.getAvgAssists()));
differences.put("avgStealsDiff", roundToTwo(season2.getAvgSteals() - season1.getAvgSteals()));
differences.put("avgBlocksDiff", roundToTwo(season2.getAvgBlocks() - season1.getAvgBlocks()));
differences.put("avgTurnoversDiff", roundToTwo(season2.getAvgTurnovers() - season1.getAvgTurnovers()));
differences.put("avgMinutesDiff", roundToTwo(season2.getAvgMinutes() - season1.getAvgMinutes()));
return differences;
}
// 生成对比报告
public String generateComparisonReport(SeasonStats season1, SeasonStats season2) {
StringBuilder report = new StringBuilder();
report.append("========== 赛季数据对比报告 ==========\n\n");
report.append(String.format("%-15s %-15s %-15s %-15s\n", "指标", season1.getSeason(), season2.getSeason(), "变化"));
report.append("----------------------------------------\n");
appendRow(report, "出场场次", season1.getGamesPlayed(), season2.getGamesPlayed());
appendRow(report, "胜场", season1.getWins(), season2.getWins());
appendRow(report, "负场", season1.getLosses(), season2.getLosses());
appendRow(report, "场均得分", season1.getAvgPoints(), season2.getAvgPoints());
appendRow(report, "场均篮板", season1.getAvgRebounds(), season2.getAvgRebounds());
appendRow(report, "场均助攻", season1.getAvgAssists(), season2.getAvgAssists());
appendRow(report, "场均抢断", season1.getAvgSteals(), season2.getAvgSteals());
appendRow(report, "场均盖帽", season1.getAvgBlocks(), season2.getAvgBlocks());
appendRow(report, "场均失误", season1.getAvgTurnovers(), season2.getAvgTurnovers());
appendRow(report, "场均上场时间", season1.getAvgMinutes(), season2.getAvgMinutes());
return report.toString();
}
private void appendRow(StringBuilder sb, String label, double value1, double value2) {
double diff = roundToTwo(value2 - value1);
String arrow = diff > 0 ? "↑" : (diff < 0 ? "↓" : "→");
sb.append(String.format("%-15s %-15.2f %-15.2f %-15.2f %s\n",
label, value1, value2, Math.abs(diff), arrow));
}
// 按月份统计月度表现
public Map<String, SeasonStats> calculateMonthlyStats(List<MatchData> matches, String season) {
Map<String, List<MatchData>> monthlyMatches = matches.stream()
.collect(Collectors.groupingBy(m -> m.getDate().getMonth().toString()));
Map<String, SeasonStats> monthlyStats = new HashMap<>();
for (Map.Entry<String, List<MatchData>> entry : monthlyMatches.entrySet()) {
String month = entry.getKey();
List<MatchData> monthMatches = entry.getValue();
monthlyStats.put(month, calculateSeasonStats(monthMatches, season + "-" + month));
}
return monthlyStats;
}
// 分析趋势
public String analyzeTrend(List<MatchData> matches, String season) {
StringBuilder trend = new StringBuilder();
trend.append("赛季趋势分析 (").append(season).append("):\n");
// 按月份分析得分趋势
Map<String, List<MatchData>> monthlyMatches = matches.stream()
.collect(Collectors.groupingBy(m -> m.getDate().getMonth().toString()));
double previousAvg = 0;
boolean first = true;
for (Map.Entry<String, List<MatchData>> entry : monthlyMatches.entrySet()) {
SeasonStats stats = calculateSeasonStats(entry.getValue(), entry.getKey());
double avgPoints = stats.getAvgPoints();
if (!first) {
double change = avgPoints - previousAvg;
String trendArrow = change > 0 ? "上升" : (change < 0 ? "下降" : "持平");
trend.append(String.format("%s: 场均%.1f分 (%s%+.1f分)\n",
entry.getKey(), avgPoints, trendArrow, change));
} else {
trend.append(String.format("%s: 场均%.1f分 (基准)\n", entry.getKey(), avgPoints));
first = false;
}
previousAvg = avgPoints;
}
return trend.toString();
}
private double roundToTwo(double value) {
return Math.round(value * 100.0) / 100.0;
}
}
数据可视化辅助类
// 可视化辅助类
class StatsVisualizer {
// 生成简单的ASCII柱状图
public void printBarChart(Map<String, Double> data, String title) {
System.out.println(title);
System.out.println("----------------------");
double maxValue = data.values().stream().max(Double::compare).orElse(1.0);
int maxBarLength = 50;
for (Map.Entry<String, Double> entry : data.entrySet()) {
int barLength = (int)((entry.getValue() / maxValue) * maxBarLength);
String bar = "█".repeat(barLength);
System.out.printf("%-20s %s %.2f\n", entry.getKey(), bar, entry.getValue());
}
System.out.println();
}
// 打印赛季对比表格
public void printComparisonTable(Player player) {
SeasonStatsService service = new SeasonStatsService();
// 假设有多个赛季的数据
Map<String, List<MatchData>> seasonMatches = getSeasonMatches(player);
System.out.println("\n🏀 " + player.getName() + " - 赛季表现对比");
System.out.println("位置: " + player.getPosition() + " | 球队: " + player.getTeam());
// 为示例创建一个简单的表格
String[] metrics = {"得分", "篮板", "助攻", "抢断", "盖帽"};
System.out.printf("%-10s", "赛季");
for (String metric : metrics) {
System.out.printf("%12s", metric);
}
System.out.println();
System.out.println("-".repeat(70));
for (Map.Entry<String, List<MatchData>> entry : seasonMatches.entrySet()) {
SeasonStats stats = service.calculateSeasonStats(entry.getValue(), entry.getKey());
System.out.printf("%-10s", entry.getKey());
System.out.printf("%12.1f", stats.getAvgPoints());
System.out.printf("%12.1f", stats.getAvgRebounds());
System.out.printf("%12.1f", stats.getAvgAssists());
System.out.printf("%12.1f", stats.getAvgSteals());
System.out.printf("%12.1f", stats.getAvgBlocks());
System.out.println();
}
}
// 获取赛季比赛数据(模拟数据)
private Map<String, List<MatchData>> getSeasonMatches(Player player) {
// 这里是模拟数据,实际应用中需要从数据库或其他数据源获取
return new HashMap<>();
}
}
主程序示例
public class SeasonStatsComparisonDemo {
public static void main(String[] args) {
// 创建示例球员
Player player = new Player("张三", "北京队", "后卫");
// 模拟2023-24赛季数据(示例)
List<MatchData> season1Matches = createMockData(2023);
// 模拟2024-25赛季数据(示例)
List<MatchData> season2Matches = createMockData(2024);
// 添加比赛数据
season1Matches.forEach(player::addMatch);
season2Matches.forEach(player::addMatch);
// 统计服务
SeasonStatsService statsService = new SeasonStatsService();
// 计算赛季统计
SeasonStats season1Stats = statsService.calculateSeasonStats(season1Matches, "23-24");
SeasonStats season2Stats = statsService.calculateSeasonStats(season2Matches, "24-25");
// 生成对比报告
String report = statsService.generateComparisonReport(season1Stats, season2Stats);
System.out.println(report);
// 分析趋势
System.out.println(statsService.analyzeTrend(season2Matches, "24-25"));
// 可视化
StatsVisualizer visualizer = new StatsVisualizer();
// 柱状图示例
Map<String, Double> metrics1 = new HashMap<>();
metrics1.put("得分", season1Stats.getAvgPoints());
metrics1.put("篮板", season1Stats.getAvgRebounds());
metrics1.put("助攻", season1Stats.getAvgAssists());
metrics1.put("抢断", season1Stats.getAvgSteals());
metrics1.put("盖帽", season1Stats.getAvgBlocks());
visualizer.printBarChart(metrics1, "23-24赛季球员表现");
Map<String, Double> metrics2 = new HashMap<>();
metrics2.put("得分", season2Stats.getAvgPoints());
metrics2.put("篮板", season2Stats.getAvgRebounds());
metrics2.put("助攻", season2Stats.getAvgAssists());
metrics2.put("抢断", season2Stats.getAvgSteals());
metrics2.put("盖帽", season2Stats.getAvgBlocks());
visualizer.printBarChart(metrics2, "24-25赛季球员表现");
}
// 创建模拟数据
private static List<MatchData> createMockData(int year) {
List<MatchData> matches = new ArrayList<>();
Random random = new Random();
String[] opponents = {"上海队", "广州队", "深圳队", "四川队", "湖北队"};
for (int month = 10; month <= 12; month++) {
for (int day = 1; day <= 28; day += 3) {
if (matches.size() >= 20) break;
LocalDate date = LocalDate.of(year, month, Math.min(day, 28));
String opponent = opponents[random.nextInt(opponents.length)];
int points = 15 + random.nextInt(15);
int rebounds = 3 + random.nextInt(8);
int assists = 2 + random.nextInt(7);
int steals = random.nextInt(3);
int blocks = random.nextInt(3);
int turnovers = 1 + random.nextInt(4);
int minutes = 20 + random.nextInt(20);
boolean isHome = random.nextBoolean();
boolean isWin = random.nextBoolean();
matches.add(new MatchData(date, opponent, points, rebounds,
assists, steals, blocks, turnovers, minutes, isHome, isWin));
}
}
return matches;
}
}
进阶功能(可选)
// 数据导入导出功能
class DataService {
// 将统计数据导出为CSV格式
public String exportToCSV(SeasonStats stats) {
StringBuilder csv = new StringBuilder();
csv.append("赛季,场次,胜,负,场均得分,场均篮板,场均助攻,场均抢断,场均盖帽,场均失误,场均上场时间\n");
csv.append(String.format("%s,%d,%d,%d,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\n",
stats.getSeason(),
stats.getGamesPlayed(),
stats.getWins(),
stats.getLosses(),
stats.getAvgPoints(),
stats.getAvgRebounds(),
stats.getAvgAssists(),
stats.getAvgSteals(),
stats.getAvgBlocks(),
stats.getAvgTurnovers(),
stats.getAvgMinutes()));
return csv.toString();
}
// 生成JSON格式数据
public String exportToJSON(SeasonStats stats) {
return String.format(
"{\"season\":\"%s\",\"gamesPlayed\":%d,\"wins\":%d,\"losses\":%d," +
"\"avgPoints\":%.2f,\"avgRebounds\":%.2f,\"avgAssists\":%.2f," +
"\"avgSteals\":%.2f,\"avgBlocks\":%.2f,\"avgTurnovers\":%.2f,\"avgMinutes\":%.2f}",
stats.getSeason(),
stats.getGamesPlayed(),
stats.getWins(),
stats.getLosses(),
stats.getAvgPoints(),
stats.getAvgRebounds(),
stats.getAvgAssists(),
stats.getAvgSteals(),
stats.getAvgBlocks(),
stats.getAvgTurnovers(),
stats.getAvgMinutes()
);
}
}
// 性能优化和缓存
class StatsCache {
private Map<String, SeasonStats> cache = new HashMap<>();
public SeasonStats getSeasonStats(String season) {
return cache.get(season);
}
public void cacheSeasonStats(String season, SeasonStats stats) {
cache.put(season, stats);
}
}
主要功能特点:
- 数据统计: 计算场均得分、篮板、助攻等核心指标
- 多赛季对比: 实现赛季间的数据对比分析
- 趋势分析: 按月份分析球员表现趋势
- 数据可视化: ASCII柱状图展示数据
- 报告生成: 生成详细的对比报告
- 数据导出: 支持CSV和JSON格式导出
这个案例可以根据实际需求进行扩展,比如添加更多的统计指标、接入真实的比赛数据源、支持多球员对比等。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播