2017-04-06 4 views
1

J'ai un prochain Tournoi de Fifa et j'ai écrit un programme qui imprime les matchs possibles. Le problème est qu'il n'est pas trié logiquement, ce qui signifie que certains joueurs devraient jouer 5-6 jeux consécutifs tandis que d'autres devraient attendre 6 jeux. Je voudrais obtenir le résultat suivant:Fixtures de tournois triés logiquement

player 1 - player 2 
player 3 - player 4 
player 5 - player 6 
player 1 - player 3 
player 2 - player 4 

et ainsi de suite. Voilà ce que j'ai en ce moment:

public class Fifa { 

public static void main(String[] args) { 
    String[] players= {"Jens", "Dane", "Keppens", "Roel", "John", "Onslo", "JonasDB", "Bellon", "Sander"}; 
    String[] players2 = {"Jens", "Dane", "Keppens", "Roel", "John", "Onslo", "JonasDB", "Bellon", "Sander"}; 


    Multimap<String, String> fixtures = LinkedHashMultimap.create(); 

    for(int i = 0; i < players.length; i++){ 
     for (int j = 0; j < players.length; j++){ 
      if(!players[i].equals(players2[j])) { 
       if(!fixtures.containsKey(players2[j])) 
       fixtures.put(players[i], players2[j]); 
      } 
     } 
    } 

    for(Map.Entry map : fixtures.entries()){ 
     String key = map.getKey().toString(); 
     Object value = map.getValue(); 
     System.out.println(key + " - " + value); 
    } 

Mais voici ce que cela imprime:

Jens - Dane 
Jens - Keppens 
Jens - Roel 
Jens - John 
Jens - Onslo 
Jens - JonasDB 
Jens - Bellon 
Jens - Sander 
Dane - Keppens 
Dane - Roel 
Dane - John 
Dane - Onslo 
Dane - JonasDB 
Dane - Bellon 
Dane - Sander 
Keppens - Roel 
Keppens - John 
Keppens - Onslo 
Keppens - JonasDB 
Keppens - Bellon 
Keppens - Sander 
Roel - John 
Roel - Onslo 
Roel - JonasDB 
Roel - Bellon 
Roel - Sander 
John - Onslo 
John - JonasDB 
John - Bellon 
John - Sander 
Onslo - JonasDB 
Onslo - Bellon 
Onslo - Sander 
JonasDB - Bellon 
JonasDB - Sander 
Bellon - Sander 

J'ai utilisé un Multimap parce que je avais besoin de plusieurs touches avec la même valeur.

+0

Dans votre exemple, quand est-ce 2 et 3 jouent les uns contre les autres? Est-ce qu'ils? Est-ce que quelque chose comme 1-2, 2-3, 3-4, 4-5, 5-6, 1-3, 2-4, etc. serait aussi bien? Parce que cela peut être fait très facilement en bouclant sur la distance au lieu de l'index. – Dukeling

+0

Ils finiraient par se jouer oui. Le "problème" de cette logique de tri est qu'il y aura toujours un joueur jouant à des jeux consécutifs, mais c'est mieux que ma mise en œuvre. Comment appliqueriez-vous cela? – Audiosleef

Répondre

2

Une approche assez simple serait de boucler sur les distances, nous avons donc première sortie tous les match-ups de la distance 1, puis 2, puis 3, etc.

La version de base de ceci:

for(int dist = 1; dist < players.length; dist++) 
for(int i = 0; i + dist < players.length; i++) 
    System.out.println(players[i] + " - " + players[i+dist]); 

Cela donnerait match-ups dans l'ordre suivant: (groupés par la distance par souci de concision)

0 - 1, 1 - 2, 2 - 3, 3 - 4, 4 - 5, 5 - 6, 
0 - 2, 1 - 3, 2 - 4, 3 - 5, 4 - 6, 
0 - 3, 1 - 4, 2 - 5, 3 - 6, 
0 - 4, 1 - 5, 2 - 6, 
0 - 5, 1 - 6, 
0 - 6, 

Si vous voulez éviter le scénario dans la première ligne où tout le monde joue 2 jeux dans une rangée, vous pouvez séparer cela et diviser des nombres impairs et même:

for(int i = 0; i < players.length-1; i+=2) 
    System.out.println(players[i] + " - " + players[i+1]); 
for(int i = 1; i < players.length-1; i+=2) 
    System.out.println(players[i] + " - " + players[i+1]); 

for(int dist = 2; dist < players.length; dist++) 
for(int i = 0; i + dist < players.length; i++) 
    System.out.println(players[i] + " - " + players[i+dist]); 

qui donne match-ups dans cet ordre:

0 - 1, 2 - 3, 4 - 5, 
1 - 2, 3 - 4, 5 - 6, 
0 - 2, 1 - 3, 2 - 4, 3 - 5, 4 - 6, 
0 - 3, 1 - 4, 2 - 5, 3 - 6, 
0 - 4, 1 - 5, 2 - 6, 
0 - 5, 1 - 6, 
0 - 6, 

Une variante de ce serait enroulent et en boucle que plus de la moitié la distance (avec un cas particulier pour éviter les correspondances de duplication de ligne distance = length/2 pour des tableaux de taille égale).

for(int i = 0; i < players.length; i+=2) 
    System.out.println(players[i] + " - " + players[(i+1)%players.length]); 
for(int i = 1; i < players.length; i+=2) 
    System.out.println(players[i] + " - " + players[(i+1)%players.length]); 

for(int dist = 2; dist < (players.length+1)/2; dist++) 
for(int i = 0; i < players.length; i++) 
    System.out.println(players[i] + " - " + players[(i+dist)%players.length]); 

if (players.length % 2 == 0) 
    for(int i = 0; i < players.length/2; i++) 
     System.out.println(players[i] + " - " + players[i+players.length/2]); 

Les match-ups se présente comme suit:

0 - 1, 2 - 3, 4 - 5, 6 - 0, 
1 - 2, 3 - 4, 5 - 6, 
0 - 2, 1 - 3, 2 - 4, 3 - 5, 4 - 6, 5 - 0, 6 - 1, 
0 - 3, 1 - 4, 2 - 5, 3 - 6, 4 - 0, 5 - 1, 6 - 2, 
+0

C'est exactement ce que je voulais, merci beaucoup! Bon à savoir c'était possible avec un seul tableau String, pas besoin de hashmap après tout! Je voudrais vous upvote mais ma réputation est trop basse. – Audiosleef