FixtureList生成器问题Java

用户名

概述

因此,我正在尝试创建一个灯具列表生成器。为了简单起见,该程序未考虑家用和家用灯具。该程序使用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> fixturesDoneMap<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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章