循环赛事是说一个小组三个人A、B、C,赛程就是A vs B,A vs C,B vs C这三种情况,如果不希望A连续参加比赛,下方代码可解决问题
循环赛比赛场次的计算方法为,n * (n - 1) / 2,n再此带表总人数,如五个人参加循环赛,比赛的次数就是5 * (5 - 1)/ 2 = 10次
如果希望先分组在进行循环赛,可以看我另一篇分组文章:对一组数据进行分组:如对参加比赛的人员进行合理分组-CSDN博客
import cn.hutool.core.util.StrUtil;
import java.util.ArrayList;
import java.util.List;
/**
* 循环赛生成比赛信息,避免同一个人连续比赛
*/
public class TournamentScheduler {
static class Match {
private String player1;
private String player2;
private int order;
public Match(String player1, String player2, int order) {
this.player1 = player1;
this.player2 = player2;
this.order = order;
}
@Override
public String toString() {
return "第" + order + "场比赛" + player1 + " vs " + player2;
}
}
public static void main(String[] args) {
List
teams.add("A");
teams.add("B");
teams.add("C");
teams.add("D");
teams.add("E");
List
for (Match match : schedule) {
System.out.println(match);
}
}
/**
* 生成比赛日程表
* 该方法根据提供的球队列表生成一个比赛日程,确保每个球队都能与其他所有球队比赛一次
* 如果球队数量为奇数,会自动添加一个"Bye"轮空标记,以确保每轮都有偶数个球队可以进行比赛
*
* @param teams 球队名称列表,用于生成比赛日程
* @return 返回一个包含所有比赛信息的列表,每场比赛包括主队、客队和比赛顺序
*/
public static List
// 初始化比赛顺序计数器
int order = 1;
// 获取球队数量
int numTeams = teams.size();
// 如果球队数量为奇数,添加"Bye"轮空标记,确保每轮比赛都有偶数个球队
if (numTeams % 2 != 0) {
teams.add(null);
}
// 计算比赛轮数,球队数量减一即为比赛轮数
int numRounds = teams.size() - 1;
// 计算每轮比赛中的一半球队数量,用于配对比赛
int halfSize = teams.size() / 2;
// 初始化比赛日程列表
List
// 外层循环生成每一轮的比赛
for (int round = 0; round < numRounds; round++) {
// 内层循环为每轮比赛配对球队
for (int i = 0; i < halfSize; i++) {
// 获取主队
String home = teams.get(i);
// 获取客队
String away = teams.get(teams.size() - 1 - i);
if(StrUtil.isNotEmpty(home) && StrUtil.isNotEmpty(away)){
// 创建比赛并添加到日程表中
schedule.add(new Match(home, away, order++));
}
}
// 调整球队顺序以生成下一轮比赛,第一轮的第二个球队移到列表末尾
String firstTeam = teams.remove(1);
teams.add(firstTeam);
}
// 返回生成的比赛日程表
return schedule;
}
}
比赛结果:
第1场比赛B vs E 第2场比赛C vs D 第3场比赛A vs B 第4场比赛D vs E 第5场比赛A vs C 第6场比赛D vs B 第7场比赛A vs D 第8场比赛E vs C 第9场比赛A vs E 第10场比赛B vs C