2017-04-06 7 views
1

Ich habe ein bevorstehendes Fifa-Turnier und ich habe ein Programm geschrieben, das die möglichen Matchups ausdruckt. Das Problem ist, dass es nicht logisch sortiert ist, was bedeutet, dass einige Spieler 5-6 aufeinanderfolgende Spiele spielen müssten, während andere 6 Spiele warten müssten. Ich möchte das folgende Ergebnis erhalten:Logisch sortierte Turnierspiele

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

und so weiter. Dies ist, was ich im Moment haben:

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); 
    } 

Aber hier ist das, was diese ausdruckt:

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 

Ich benutzte ein Multimap, weil ich mehrere Schlüssel mit dem gleichen Wert benötigt.

+0

In Ihrem Beispiel, wenn tut 2 und 3 gegeneinander spielen? Tun sie? Wäre auch etwas wie 1-2, 2-3, 3-4, 4-5, 5-6, 1-3, 2-4 usw. in Ordnung? Weil das wirklich einfach gemacht werden kann, indem man die Entfernung statt des Indexes überbrückt. – Dukeling

+0

Sie würden sich schließlich ja gegenseitig spielen. Das "Problem" mit dieser Sortierlogik ist, dass es immer einen Spieler geben würde, der in aufeinanderfolgenden Spielen spielt, aber es ist besser als meine Implementierung. Wie würdest du das umsetzen? – Audiosleef

Antwort

2

Ein etwas einfacher Ansatz zur Schleife über die Distanzen wäre, so dass wir erste Ausgabe alle Match-Ups von Abstand 1, dann 2, dann 3 usw.

Die Basisversion dieses:

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]); 

Dies würde in der folgenden Reihenfolge Match-Ups geben: (Reihenfolge nach Entfernung sortiert Kürze halber)

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, 

Wenn Sie das Szenario in der ersten Zeile vermeiden wollen, wo jeder 2 Spiele in Folge spielt, Sie können das trennen und spaltete es durch gerade und ungerade Zahlen:

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]); 

Das Match-Ups in dieser Reihenfolge ergibt:

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, 

Eine Variation dieser um würde Einwickeln und nur über die Hälfte looping die Entfernung (mit einem speziellen Fall, um die distance = length/2 Linie zu vermeiden, die Match-ups für gerade-sortierte Anordnungen dupliziert).

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]); 

Die Match-ups würde wie folgt aussehen:

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

Genau das wollte ich, vielen Dank! Gut zu wissen, dass es mit nur einem String-Array möglich war, brauchte keine hashmap! Ich würde Sie auffrischen, aber mein Ruf ist zu niedrig. – Audiosleef