本文目录导读:

看两队主客场战绩差异,核心思路是将两队在不同场地(主场/客场)的表现拆开对比,在Java中,通常通过对象建模和数据聚合来实现。
以下是完整的实现思路和代码案例:
核心思路(业务逻辑)
主客场战绩差异主要看三个维度:
- 胜率差异:A队主场胜率 vs B队客场胜率。
- 场均得失分差异:A队主场场均得分 - B队客场场均失分(模拟攻防强度)。
- 净胜分差异:A队主场净胜分 vs B队客场净胜分。
数据建模(Java Bean)
需要设计一个包含主客场数据的实体类,假设我们有一张比赛记录表或一个统计类。
// 队伍战绩对象(含主客场)
public class TeamRecord {
private String teamName; // 队名
private int homeWins; // 主场胜
private int homeLosses; // 主场负
private int awayWins; // 客场胜
private int awayLosses; // 客场负
private double homePointsScored; // 主场场均得分
private double homePointsAllowed; // 主场场均失分
private double awayPointsScored; // 客场场均得分
private double awayPointsAllowed; // 客场场均失分
// 计算主场胜率
public double getHomeWinRate() {
int total = homeWins + homeLosses;
return total == 0 ? 0 : (double) homeWins / total;
}
// 计算客场胜率
public double getAwayWinRate() {
int total = awayWins + awayLosses;
return total == 0 ? 0 : (double) awayWins / total;
}
// 计算主场净胜分
public double getHomeNetPoints() {
return homePointsScored - homePointsAllowed;
}
// 计算客场净胜分
public double getAwayNetPoints() {
return awayPointsScored - awayPointsAllowed;
}
// ... 省略getter/setter
}
对比逻辑(核心计算类)
编写一个专门的对比类,传入两个队伍对象,输出差异分析。
import java.util.HashMap;
import java.util.Map;
public class HomeAwayComparator {
/**
* 对比两队主客场战绩差异
* @param teamA 队伍A
* @param teamB 队伍B
* @return 包含差异指标的Map
*/
public static Map<String, String> compare(TeamRecord teamA, TeamRecord teamB) {
Map<String, String> result = new HashMap<>();
// 1. 胜率对比
double aHomeWinRate = teamA.getHomeWinRate();
double bAwayWinRate = teamB.getAwayWinRate();
result.put("A主场胜率 vs B客场胜率",
String.format("%.1f%% vs %.1f%%", aHomeWinRate * 100, bAwayWinRate * 100));
// 2. 攻防指标(A主场进攻 vs B客场防守)
double aHomeScore = teamA.getHomePointsScored();
double bAwayAllowed = teamB.getAwayPointsAllowed();
result.put("A主场场均得分 vs B客场场均失分",
String.format("%.1f vs %.1f (差值: %.1f)", aHomeScore, bAwayAllowed, aHomeScore - bAwayAllowed));
// 3. 净胜分对比
double aHomeNet = teamA.getHomeNetPoints();
double bAwayNet = teamB.getAwayNetPoints();
result.put("A主场净胜分 vs B客场净胜分",
String.format("%+.1f vs %+.1f", aHomeNet, bAwayNet));
// 4. 综合判定(简单规则:谁的优势大)
boolean aAdvantage = (aHomeWinRate > bAwayWinRate) && (aHomeNet > bAwayNet);
result.put("quot;, aAdvantage ? "A队主场优势明显" : "B队客场表现更佳或差距不大");
return result;
}
// 主方法测试
public static void main(String[] args) {
// 构建示例数据
TeamRecord lakers = new TeamRecord();
lakers.setTeamName("湖人");
lakers.setHomeWins(25); lakers.setHomeLosses(5);
lakers.setAwayWins(18); lakers.setAwayLosses(12);
lakers.setHomePointsScored(110.5); lakers.setHomePointsAllowed(104.2);
lakers.setAwayPointsScored(106.8); lakers.setAwayPointsAllowed(108.3);
TeamRecord celtics = new TeamRecord();
celtics.setTeamName("凯尔特人");
celtics.setHomeWins(20); celtics.setHomeLosses(10);
celtics.setAwayWins(15); celtics.setAwayLosses(15);
celtics.setHomePointsScored(112.3); celtics.setHomePointsAllowed(103.1);
celtics.setAwayPointsScored(105.4); celtics.setAwayPointsAllowed(104.9);
// 执行对比
Map<String, String> comparison = compare(lakers, celtics);
// 输出结果
System.out.println("=== 主客场战绩差异分析 ===");
for (Map.Entry<String, String> entry : comparison.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}
}
}
输出示例
运行上述代码,控制台将输出类似:
=== 主客场战绩差异分析 ===
A主场胜率 vs B客场胜率: 83.3% vs 50.0%
A主场场均得分 vs B客场场均失分: 110.5 vs 104.9 (差值: 5.6)
A主场净胜分 vs B客场净胜分: +6.3 vs +0.5
A队主场优势明显
进阶扩展(处理真实数据源)
如果数据来自数据库或CSV,可以增加一个数据加载器:
// 从数据行构建TeamRecord
public static TeamRecord fromCsvRow(String[] row) {
TeamRecord record = new TeamRecord();
record.setTeamName(row[0]);
record.setHomeWins(Integer.parseInt(row[1]));
// ... 其他字段
return record;
}
如果数据量较大,可以使用 Java Stream API 进行批量对比:
List<TeamRecord> teams = loadAllTeams();
// 找出所有队伍中主场胜率最高的
TeamRecord bestHome = teams.stream()
.max(Comparator.comparing(TeamRecord::getHomeWinRate))
.orElse(null);
关键点提炼
- 建模:把主客场数据分开存入对象字段(胜/负/得分/失分)。
- 计算派生指标:胜率、净胜分等用
getter方法计算,避免重复代码。 - 对比逻辑:明确你想看什么(胜率差?攻防差?),封装成方法。
- 输出友好:用
String.format格式化百分比和差值,便于阅读。
这样,既能应对简单的两两对比,也能方便地扩展到全联盟排名分析。