Java 案例:查看两队历史交锋记录
下面给你一个完整的 Java 案例,模拟"查看两支球队历史交锋记录"的功能。

需求分析
一支球队的历史交锋记录通常包含:
- 主队、客队
- 比赛日期
- 主队进球、客队进球
- 比赛结果(胜/平/负)
功能:
- 录入/初始化历史比赛数据
- 根据两队名称查询所有交锋记录
- 统计两队的胜平负场次
实体类 Match
import java.time.LocalDate;
public class Match {
private String homeTeam; // 主队
private String awayTeam; // 客队
private LocalDate date; // 比赛日期
private int homeGoals; // 主队进球
private int awayGoals; // 客队进球
public Match(String homeTeam, String awayTeam, LocalDate date, int homeGoals, int awayGoals) {
this.homeTeam = homeTeam;
this.awayTeam = awayTeam;
this.date = date;
this.homeGoals = homeGoals;
this.awayGoals = awayGoals;
}
// 判断是否是这两支球队之间的比赛(不考虑主客)
public boolean isBetween(String teamA, String teamB) {
return (homeTeam.equals(teamA) && awayTeam.equals(teamB))
|| (homeTeam.equals(teamB) && awayTeam.equals(teamA));
}
// 返回比分字符串
public String getScore() {
return homeGoals + " : " + awayGoals;
}
// 从指定球队视角返回结果:W胜 / D平 / L负
public String getResultFor(String team) {
int teamGoals = homeTeam.equals(team) ? homeGoals : awayGoals;
int oppGoals = homeTeam.equals(team) ? awayGoals : homeGoals;
if (teamGoals > oppGoals) return "W";
if (teamGoals < oppGoals) return "L";
return "D";
}
@Override
public String toString() {
return String.format("%s %s %d - %d %s",
date, homeTeam, homeGoals, awayGoals, awayTeam);
}
// getter
public String getHomeTeam() { return homeTeam; }
public String getAwayTeam() { return awayTeam; }
public LocalDate getDate() { return date; }
}
业务类 MatchService
import java.util.*;
import java.util.stream.Collectors;
public class MatchService {
private final List<Match> matches = new ArrayList<>();
// 添加一场比赛
public void addMatch(Match m) {
matches.add(m);
}
// 查询两队所有交锋记录(按日期升序)
public List<Match> getHeadToHead(String teamA, String teamB) {
return matches.stream()
.filter(m -> m.isBetween(teamA, teamB))
.sorted(Comparator.comparing(Match::getDate))
.collect(Collectors.toList());
}
// 打印两队交锋记录 + 胜平负统计
public void printHeadToHead(String teamA, String teamB) {
List<Match> h2h = getHeadToHead(teamA, teamB);
System.out.println("===== " + teamA + " vs " + teamB + " 历史交锋 =====");
if (h2h.isEmpty()) {
System.out.println("暂无交锋记录");
return;
}
int winA = 0, winB = 0, draw = 0;
for (Match m : h2h) {
System.out.println(m);
String r = m.getResultFor(teamA);
if ("W".equals(r)) winA++;
else if ("L".equals(r)) winB++;
else draw++;
}
System.out.println("-----------------------------------------");
System.out.printf("共 %d 场:%s 胜 %d 场,平 %d 场,%s 胜 %d 场%n",
h2h.size(), teamA, winA, draw, teamB, winB);
}
}
测试主类 Main
import java.time.LocalDate;
public class Main {
public static void main(String[] args) {
MatchService service = new MatchService();
// 模拟历史数据
service.addMatch(new Match("皇家马德里", "巴塞罗那", LocalDate.of(2023, 3, 19), 2, 1));
service.addMatch(new Match("巴塞罗那", "皇家马德里", LocalDate.of(2023, 10, 28), 1, 2));
service.addMatch(new Match("皇家马德里", "巴塞罗那", LocalDate.of(2024, 1, 14), 4, 1));
service.addMatch(new Match("巴塞罗那", "皇家马德里", LocalDate.of(2024, 4, 21), 3, 2));
// 其它比赛,不应被查到
service.addMatch(new Match("曼城", "利物浦", LocalDate.of(2024, 2, 10), 1, 1));
// 查看皇马 vs 巴萨 历史交锋
service.printHeadToHead("皇家马德里", "巴塞罗那");
}
}
运行结果
===== 皇家马德里 vs 巴塞罗那 历史交锋 =====
2023-03-19 皇家马德里 2 - 1 巴塞罗那
2023-10-28 巴塞罗那 1 - 2 皇家马德里
2024-01-14 皇家马德里 4 - 1 巴塞罗那
2024-04-21 巴塞罗那 3 - 2 皇家马德里
-----------------------------------------
共 4 场:皇家马德里 胜 3 场,平 0 场,巴塞罗那 胜 1 场
关键设计点
| 环节 | 说明 |
|---|---|
| 数据存储 | 用 List<Match> 保存所有比赛,简单直观 |
| 交锋过滤 | isBetween 忽略主客队顺序,两队在哪都算交锋 |
| 结果统计 | getResultFor(team) 站在指定球队视角返回 W/D/L |
| 排序 | sorted(Comparator.comparing(Match::getDate)) 按时间线展示 |
| 聚合 | Java Stream 一行完成"过滤 + 排序 + 收集" |
可扩展方向
- 接数据库:把
List换成 JDBC / MyBatis / JPA 查询,SQL 例子:SELECT * FROM match WHERE (home_team=? AND away_team=?) OR (home_team=? AND away_team=?) ORDER BY match_date;
- API 接口:用 Spring Boot 暴露
GET /h2h?teamA=...&teamB=... - 更多维度统计:进球总数、场均进球、N 场走势
- 缓存:热门球队交锋结果可加
Map<String, List<Match>>缓存
如果你要的是具体的某个平台(比如足球经理游戏、某个 App、某 API),可以告诉我是哪个,我给你对应的实现方式。