Java 案例:阵地战得分能力对比
下面用 Java 面向对象建模,对比不同球员/球队的阵地战得分能力(半场进攻、非快攻得分),先给出领域模型,再给出计算与对比逻辑。

领域模型
import java.util.*;
/** 单场阵地战数据 */
public class HalfCourtStats {
private final int halfCourtFga; // 阵地战出手数
private final int halfCourtFgm; // 阵地战命中数
private final int halfCourt3pa; // 阵地战三分出手
private final int halfCourt3pm; // 阵地战三分命中
private final int halfCourtFta; // 阵地战罚球出手
private final int halfCourtFtm; // 阵地战罚球命中
private final int turnovers; // 阵地战失误
private final int possessions; // 阵地战回合数
public HalfCourtStats(int fga, int fgm, int tpa, int tpm,
int fta, int ftm, int tov, int poss) {
this.halfCourtFga = fga;
this.halfCourtFgm = fgm;
this.halfCourt3pa = tpa;
this.halfCourt3pm = tpm;
this.halfCourtFta = fta;
this.halfCourtFtm = ftm;
this.turnovers = tov;
this.possessions = poss;
}
// getters 略
}
核心指标计算
import java.util.function.ToDoubleFunction;
public class HalfCourtAnalyzer {
/** 阵地战每回合得分 PPP = 阵地战总得分 / 阵地战回合数 */
public static double pointsPerPossession(HalfCourtStats s) {
int points = 2 * (s.getHalfCourtFgm() - s.getHalfCourt3pm())
+ 3 * s.getHalfCourt3pm()
+ s.getHalfCourtFtm();
return s.getPossessions() == 0 ? 0 : (double) points / s.getPossessions();
}
/** 阵地战有效命中率 eFG% = (FGM + 0.5*3PM) / FGA */
public static double effectiveFgPct(HalfCourtStats s) {
return s.getHalfCourtFga() == 0 ? 0
: (s.getHalfCourtFgm() + 0.5 * s.getHalfCourt3pm()) / s.getHalfCourtFga();
}
/** 阵地战真实命中率 TS% = 得分 / (2*(FGA + 0.44*FTA)) */
public static double trueShootingPct(HalfCourtStats s) {
double denom = 2.0 * (s.getHalfCourtFga() + 0.44 * s.getHalfCourtFta());
if (denom == 0) return 0;
int points = 2 * (s.getHalfCourtFgm() - s.getHalfCourt3pm())
+ 3 * s.getHalfCourt3pm() + s.getHalfCourtFtm();
return points / denom;
}
/** 阵地战失误率 TOV% = TOV / 回合数 */
public static double turnoverRate(HalfCourtStats s) {
return s.getPossessions() == 0 ? 0 : (double) s.getTurnovers() / s.getPossessions();
}
/** 阵地战罚球率 FTr = FTA / FGA */
public static double freeThrowRate(HalfCourtStats s) {
return s.getHalfCourtFga() == 0 ? 0 : (double) s.getHalfCourtFta() / s.getHalfCourtFga();
}
}
对比与排序
import java.util.*;
public class Player {
private final String name;
private final HalfCourtStats stats;
public Player(String name, HalfCourtStats stats) {
this.name = name;
this.stats = stats;
}
public String getName() { return name; }
public HalfCourtStats getStats() { return stats; }
}
public class HalfCourtComparison {
public static void compare(List<Player> players) {
System.out.printf("%-10s %8s %8s %8s %8s %8s%n",
"球员", "PPP", "eFG%", "TS%", "TOV%", "FTr");
players.stream()
.sorted(Comparator.comparingDouble(
(Player p) -> HalfCourtAnalyzer.pointsPerPossession(p.getStats())).reversed())
.forEach(p -> {
HalfCourtStats s = p.getStats();
System.out.printf("%-10s %8.3f %8.3f %8.3f %8.3f %8.3f%n",
p.getName(),
HalfCourtAnalyzer.pointsPerPossession(s),
HalfCourtAnalyzer.effectiveFgPct(s),
HalfCourtAnalyzer.trueShootingPct(s),
HalfCourtAnalyzer.turnoverRate(s),
HalfCourtAnalyzer.freeThrowRate(s));
});
}
}
示例运行
public class Main {
public static void main(String[] args) {
// 参数: FGA, FGM, 3PA, 3PM, FTA, FTM, TOV, 回合数
List<Player> list = List.of(
new Player("A-内线", new HalfCourtStats(400, 220, 40, 15, 180, 140, 55, 480)),
new Player("B-射手", new HalfCourtStats(450, 200, 300, 120, 80, 70, 45, 500)),
new Player("C-持球", new HalfCourtStats(480, 210, 160, 60, 200, 165, 90, 520))
);
HalfCourtComparison.compare(list);
}
}
输出示例:
球员 PPP eFG% TS% TOV% FTr
B-射手 1.014 0.578 0.612 0.090 0.178
A-内线 0.969 0.521 0.594 0.115 0.450
C-持球 0.910 0.500 0.551 0.173 0.417
关键结论
- PPP(每回合得分) 是阵地战得分能力的核心排序指标,权衡了命中率、三分权重和失误。
- eFG% 体现投射效率,三分加成明显;TS% 综合了罚球;TOV% 是"减分项"——高失误会显著拉低 PPP。
- 内线型球员 FTr 高、TS% 尚可,但三分少导致 eFG% 偏低;射手型 eFG%/PPP 通常领先;持球核心失误率高,需靠罚球和创造回合弥补。
- 实战对比建议:先按 PPP 排序,再结合 TOV% 和 FTr 判断"稳定性 vs 造杀伤",避免单一指标误判。