java实践2-Final fixture list(最终赛程单)

本文详细探讨了Java编程中Final Fixture List的概念及其应用,解释了如何在实际项目中创建并使用最终赛程单,涵盖了相关的关键技术和最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package First;

import javax.swing.JOptionPane;

public class Main
{
	public static void main(String[] args)
	{
		int numberOfTeams, totalNumberOfRounds, numberOfMatchesPerRound; // 队伍数,总轮数,每轮回合数
		int homeTeamNumber, awayTeamNumber, even, odd; // 主队,客队,偶数,奇数
		int roundNumber, matchNumber; // 轮数,回合数
		boolean additionalTeamIncluded = false; //默认不需要加一个虚空队
		String selection;  //输入的字符
		String[][] fixtures;  //赛程
		String[][] revisedFixtures;  //改进的赛程
		String[] elementsOfFixture;  //赛程的元素  //回合
		String fixtureAsText;  //赛程文本
		selection = getNumberOfTeams("Team Number Entry", "Please enter a number in the range 2 to 99");

		if (selection != null) //能避免直接点“取消”的情况带来的错误
		{
			numberOfTeams = Integer.parseInt(selection); //把输入的字符串转成int型,进行下一步操作
			if (numberOfTeams % 2 == 1) //判定是否为奇数,如果为奇数,那需要加个虚空队
			{
				numberOfTeams++;  //队伍数+1
				additionalTeamIncluded = true; //转成true
			}
			totalNumberOfRounds = numberOfTeams - 1;  //总轮数
			numberOfMatchesPerRound = numberOfTeams / 2; //每轮回合数
			fixtures = new String[totalNumberOfRounds][numberOfMatchesPerRound]; 
			//建二维字符串数组,以字符串形式存第r轮第m回合的队伍的代号(fixtures[r-1][m-1]);
			//如输入4,会得到第1轮第1回合为:1 v 4 ->fixtures[0][0]

			for (roundNumber = 0; roundNumber < totalNumberOfRounds; roundNumber++) //双层循环,完整走一遍
			{
				for (matchNumber = 0; matchNumber < numberOfMatchesPerRound; matchNumber++)
				{
					homeTeamNumber = (roundNumber + matchNumber) % (numberOfTeams - 1);
					awayTeamNumber = (numberOfTeams - 1 - matchNumber + roundNumber) % (numberOfTeams - 1);
					if (matchNumber == 0) //如果matchNumber为0,awayTeamNumber会变成序号最大的队
						awayTeamNumber = numberOfTeams - 1;
					fixtures[roundNumber][matchNumber] = (homeTeamNumber + 1) + " v " + (awayTeamNumber + 1);
				}
			}
	
			/*
			  for (roundNumber = 0; roundNumber < totalNumberOfRounds; roundNumber++) 
			{
				for (matchNumber = 0; matchNumber < numberOfMatchesPerRound; matchNumber++)
				{
					System.out.println(fixtures[roundNumber][matchNumber]);
				}
			}
			System.out.println();
			*/
			revisedFixtures = new String[totalNumberOfRounds][numberOfMatchesPerRound];  //开空间
			even = 0;
			odd = numberOfTeams / 2;        
			for (int i = 0; i < fixtures.length; i++)   //将轮数按奇偶性分为两组,交叉排列
			{
				if (i % 2 == 0)                              
					revisedFixtures[i] = fixtures[even++];
				else
					revisedFixtures[i] = fixtures[odd++];
			}
			fixtures = revisedFixtures;  //将改进版的赛程表赋给原赛程表

			/*
			  for (roundNumber = 0; roundNumber < totalNumberOfRounds; roundNumber++) 
			{
				for (matchNumber = 0; matchNumber < numberOfMatchesPerRound; matchNumber++)
				{
					System.out.println(fixtures[roundNumber][matchNumber]);
				}
			}
			System.out.println();
			*/
			for (roundNumber = 0; roundNumber < fixtures.length; roundNumber++)  
				//当轮数为偶数时,将第一回合的主客场队伍调换
			{
				if (roundNumber % 2 == 1)
				{
					fixtureAsText = fixtures[roundNumber][0];
					elementsOfFixture = fixtureAsText.split(" v ");
					fixtures[roundNumber][0] = elementsOfFixture[1] + " v " + elementsOfFixture[0];
				}
			}
			
			/*
			  for (roundNumber = 0; roundNumber < totalNumberOfRounds; roundNumber++) 
			{
				for (matchNumber = 0; matchNumber < numberOfMatchesPerRound; matchNumber++)
				{
					System.out.println(fixtures[roundNumber][matchNumber]);
				}
			}
			System.out.println();
			*/
			for (roundNumber = 0; roundNumber < totalNumberOfRounds; roundNumber++)  //最终的输出版本
			{
				System.out.println("Round " + (roundNumber + 1) + "\t\t");
				for (matchNumber = 0; matchNumber < numberOfMatchesPerRound; matchNumber++)
					System.out.println("\tMatch " + (matchNumber + 1) + ": " + fixtures[roundNumber][matchNumber] + "\t");
				System.out.println();
			}
			System.out.println();
			System.out.println("\nYou will have to use the mirror image of these fixtures for return fixtures.");

			if (additionalTeamIncluded)  //如果加了个虚空队
				System.out.println(
						"\nSince you had " + (numberOfTeams - 1) + " teams at the outset (uneven number), fixtures "
								+ "against team number " + numberOfTeams + " are byes.");
		}
	}

	public static String getNumberOfTeams(String windowMessage, String windowTitle)
	{
		boolean validInput = false;  //默认输入是无效的
		//int numberOfTeams;       
		String userInput = "", pattern = "[0-9]{1,2}";
		//userInput默认为空,能和if (selection != null)完成用户是否取消了输入的判断,这也是为什么userInput必须保留为String型
		//用正则表达式判定是否合规,但正则表达式不能过滤01,00,1,0四个可能性
		String errorMessage = "Invalid input.\n\nYou are permitted to have 2 to 99 teams.\nSelect OK to retry.";
		while (!(validInput)) //当输入是无效时
		{
			userInput = JOptionPane.showInputDialog(null, windowMessage, windowTitle, 3); //输入字符串型的队伍数
			if (userInput == null) //没输入字符,直接“确定”了
				validInput = true;
			else if (!userInput.matches(pattern)) //输入不符合规定,需要重新输入
				JOptionPane.showMessageDialog(null, errorMessage, "Error in user input", 2);
			/*else
			{
				numberOfTeams = Integer.parseInt(userInput);
				if (numberOfTeams < 2)
					JOptionPane.showMessageDialog(null, errorMessage, "Error in user input", 2);
				else
					validInput = true;
			}*/
			else
			{
				if(userInput.equals("01")||userInput.equals("00")||userInput.equals("1")||userInput.equals("0"))
					JOptionPane.showMessageDialog(null, errorMessage, "Error in user input", 2);
				else
					validInput = true;
			}
		}
		return userInput;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值