因此,我正在尝试创建一个灯具列表生成器。为了简单起见,该程序未考虑家用和家用灯具。该程序使用generateFixtures()方法每轮生成夹具,然后重复指定的轮次,直到生成所有夹具为止。
将generateFixtures方法的参数传递给arrayList,该部门中的所有团队都需要为该回合生成固定装置。同样,传递的arrayList将始终包含20个团队。然后,创建两个字符串,这些字符串保存arraylist中一个的随机组的值。然后,generateFixtures()使用hasUsed()方法检查是否有任何一支球队用于该回合。它还会检查整个赛季是否已经确定了哪支球队(但我将在稍后详细解释这部分)。然后,它将进行进一步检查以测试以确保两个团队不相同(在那个team1 == team2中)。完成所有检查后,它将两个团队放入夹具列表图中,称为fixturesDone。并且也将两支球队置于“二手”状态 arraylist,以便在该回合中不再使用两个团队。它会不断重复while循环,直到固定所有团队为止(因为arraylist的“已用”大小大于或等于19)。然后在main方法中设置一个循环,以保持循环generateFixtures()方法,直到整个季节的所有固定装置都完成为止。
该问题发生在“ fixturesDone”贴图或hasFixtured()方法中。老实说,不确定是谁引起了问题。当我从if语句内部直接通过generateFixtures方法打印出灯具时,生成了灯具,但通常有重复的灯具,而当我从'fixturesDone'映射中输出灯具时,没有重复的灯具,但似乎只有如果存在20个固定装置,并且总是20个,这表明我可能在其中一个回路中弄乱了某些东西。我已经解决了这个问题几个小时了,我真的很困惑,所以我们将不胜感激:)
无论如何,请记住我在这里所说的是必要的代码,祝您好运。
public static void generateFixtures(ArrayList<String> al){
ArrayList<String> used = new ArrayList<String>();
while(used.size() <= 19){
String team = al.get(showRandomInteger(0, 19, r));
String team2 = al.get(showRandomInteger(0, 19, r));
if(alreadyUsed(used, team, team2) == false && alreadyFixtured(fixturesDone, team, team2) == false && !team.equals(team2)){
fixturesDone.put(team, team2);
used.add(team);
used.add(team2);
System.out.println(team + "vs. " + team2);
}
}
System.out.println("\n New week \n");
}
public static boolean alreadyFixtured(Map <String, String> m, String team1, String team2){
if(m.containsKey(team1) || m.containsKey(team2)){
for(Map.Entry<String, String> entry : m.entrySet()){
if((entry.getKey().equals(team1) && entry.getValue().equals(team2)) || (entry.getKey().equals(team2) && entry.getValue().equals(team1)) ){
return true;
}else{
return false;
}
}
}else{
return false;
}
return false;
}
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
for(int i = 0; i <= 19; i++){
generateFixtures(ReadXML(1));
}
System.out.println("\n Map version: ");
for(Map.Entry <String, String> entry : fixturesDone.entrySet()){
System.out.println(entry.getKey() + " vs. " + entry.getValue());
}
}
您的alreadyFixtured
逻辑混乱了。它只会检查映射中的第一个条目,因为您仅在检查了foreach循环中的第一个条目后才返回true或false。确实,您可以将代码替换为:
if(m.containsKey(team1))
return m[team1].equals(team2);
if(m.containsKey(team2))
return m[team2].equals(team1);
return false;
但是您还需要比该fixturesDone
映射更好的数据结构。这引出我的下一个观点。
您的fixturesDone地图(我假设是全局的)几乎没有用。由于每个键只能在地图中出现一次,因此您最多只能与前两轮进行比较,并且覆盖每次调用generateFixtures的键/值对的一半。您应该将假定值更改Map<String, String> fixturesDone
为Map<String, ArrayList<String>>
,在这种情况下,您需要将alreadyFixtured
逻辑更改为:
if(m.containsKey(team1))
return m[team1].contains(team2);
if(m.containsKey(team2))
return m[team2].contains(team1);
return false;
您还应该将团队选择更改为“同时执行”循环:
String team, team2;
do{
team = al.get(showRandomInteger(0, 19, r));
}while(used.contains(team));
do{
team2 = al.get(showRandomInteger(0, 19, r));
}while(used.contains(team2) || team2.equals(team1));
然后,随后的if语句可以写为:
if(!alreadyFixtured(fixturesDone, team, team2))
但是,您仍然存在潜在的问题,即在特定回合中仅剩下已经互相比赛的团队,在这种情况下,您的代码将无限期地循环。这听起来并不简单。以一种循环方式生成所有灯具,然后将这些灯具的出现顺序随机化可能会更容易。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句