Java足球联赛赛程生成算法问题:洗牌偶致程序卡顿
足球联赛赛程生成Java代码问题
需求说明
需要实现足球联赛赛程生成功能,具体要求:
- 赛季上半程生成各周对阵,示例格式如下:
Half round of the season 1. week Team1 - Team2 Team3 - Team4 2. week Team1 - Team3 Team2 - Team4 3. week Team1 - Team4 Team2- Team3 ...
- 赛季下半程对阵主客场完全互换,计划通过
homeT和awayT两个LinkedList实现
问题现象
当前上半程生成逻辑存在问题:使用Collections.shuffle()方法打乱球队列表时,程序有时能成功生成所有周的赛程,有时会卡顿无法完成全部计算。
实现逻辑
- 从控制台获取球队数量,依次输入球队名称并存入LinkedList
- 先生成第一周的赛程,再通过条件判断生成后续周的赛程
- 怀疑问题出在检查对阵是否重复的for循环,该循环有时能正确执行,有时无法正常工作
完整代码
public void run() { System.out.print("Enter team count: "); Scanner scanner = new Scanner(System.in); int teamCount = scanner.nextInt(); LinkedList<String> teams = new LinkedList<>(); for (int i = 0; i < teamCount; i++) { System.out.print("Enter team name: "); teams.add(scanner.next()); } for (String i : teams) { System.out.print(i + " "); } LinkedList<String> homeT = new LinkedList<>(); LinkedList<String> awayT = new LinkedList<>(); LinkedList<String> cloneList = new LinkedList<>(); int counter = 1; boolean afterFirstWeek = false; boolean t = false; for (int i = 0; i < teamCount - 1; i++) { String homeTeam; String awayTeam; int matchCount = 0; String weeksMatches = ""; cloneList = (LinkedList<String>) teams.clone(); // 每周刷新球队列表 while (matchCount < teamCount / 2) { boolean isContinue = true; if (afterFirstWeek) { Collections.shuffle(cloneList); homeTeam = cloneList.peek(); cloneList.removeFirst(); awayTeam = cloneList.peek(); cloneList.removeFirst(); for (int j = 0; j < homeT.size(); j++) { if ((homeTeam.equals(homeT.get(j)) && awayTeam.equals(awayT.get(j))) || (awayTeam.equals(awayT.get(j)) && homeTeam.equals(homeT.get(j)))) { isContinue = false; } if (homeTeam.equals(awayT.get(j)) && awayTeam.equals(homeT.get(j))) { isContinue = false; } } if (isContinue) { homeT.add(homeTeam); awayT.add(awayTeam); weeksMatches += homeTeam + " vs " + awayTeam + "\n"; matchCount++; counter++; } else { Collections.shuffle(cloneList); cloneList.add(homeTeam); cloneList.add(awayTeam); Collections.shuffle(cloneList); } } else { Collections.shuffle(cloneList); homeTeam = cloneList.peek(); cloneList.removeFirst(); awayTeam = cloneList.peek(); cloneList.removeFirst(); homeT.add(homeTeam); awayT.add(awayTeam); weeksMatches += homeTeam + " vs " + awayTeam + "\n"; matchCount++; counter++; } if (!afterFirstWeek && matchCount == teamCount / 2) afterFirstWeek = true; } System.out.println(); System.out.println(i + 1 + ". week matches"); System.out.println(weeksMatches); } for (int i = 0; i < counter; i++) { } }
疑似问题代码片段
for (int j = 0; j < homeT.size(); j++) { if ((homeTeam.equals(homeT.get(j)) && awayTeam.equals(awayT.get(j))) || (awayTeam.equals(awayT.get(j)) && homeTeam.equals(homeT.get(j)))) { isContinue = false; } if (homeTeam.equals(awayT.get(j)) && awayTeam.equals(homeT.get(j))) { isContinue = false; } }
内容的提问来源于stack exchange,提问作者Akın
相关产品推荐
相关产品推荐

