# KO-Turnier



## devo22 (26. Nov 2011)

Hi, ich soll ein KO-Turnier erstellen, das Ergebnis (Sieger, Finalist, Halbfinalisten etc) zufällig bestimmen und am Ende das Turnierergebnis in dieser Form ausgeben, zB:

Sieger: F
Finalist: C
Halbfinale: F:A, C:B
Viertelfinale: F:H, C:E, A:G, B
...

Ich habe es bereits geschafft, mit Scanner ein Turnier mit 4, 8, 16 und 32 Teilnehmern aufzubauen, mit collections.shuffle die Liste mit den Teilnehmern durchzumischen und Sieger und Finalist auszugeben. Was ich nicht schaffe ist der Aufbau der Turnierstruktur am Ende. Hat jemand eine Idee, wie das am einfachsten/effektivsten umzusetzen wäre? Würde mich über jede Hilfe freuen!!!

Hier mein bisheriger Code:


```
import java.util.*;
import java.io.*;

public class Tournament {

  public static void main (String [] args) {
	
	
	System.out.println("How many teams should participate? 4, 8, 16 or 32?");
	
	Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
	LinkedList list = new LinkedList();
	String s="";
	
	if (n == 4)
	{
	s = "A B C D";
	}
	
	if (n == 8)
	{
	s = "A B C D E F G H";
	}
	
	if (n == 16)
	{
	s = "A B C D E F G H I J K L M N O P";
	}
	
	if (n == 32)
	{
	s = "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5";
	}
	
	System.out.println();
	System.out.println("Participants: ");
	System.out.println(s);
	System.out.println();
	
	Scanner number = new Scanner(s);
	
	while (number.hasNext()) {
	list.add(number.next());
	}
	System.out.println();
		
	ListIterator it = list.listIterator();
	
	Collections.shuffle(list, new Random());        
     
     System.out.println("Winner: " + list.get(0));
	 System.out.println("Runner-up: " + list.get(1));
	 System.out.println("");
	}
}
```


----------



## Marco13 (26. Nov 2011)

Poste mal mehr Details von der Aufgabenstellung. Ist dort explizit gefortder, Strings in dieser Form zu verwenden? Das sieht sehr schräg aus (wenn, dann kann man es auch einfacher machen, aber nur um das einordnen zu können...)


----------



## devo22 (26. Nov 2011)

Die komplette Aufgabenstellung lautet folgendermaßen:



> Write a program that first accepts a list of players participating in a knock-out tournament.
> Then it shall randomly determine the initial pairings.
> It shall further accept the results of the individual competitions in any logically possible order.
> Finally it shall print the result tree in the following form: winner at the top, 2nd line: finals pairing, 3rd line: the 2 semi-finals pairings, etc.
> ...


----------



## Gast2 (26. Nov 2011)

Ich würde mir auf jedenfall noch mindestens eine Klasse Paarung erstellen, die zwei Teilnehmer enthält und per Zufallszahl einen Gewinner bestimmt.
Pro Runde hast du eine Liste mit Paarungen. Aus den Gewinnern der jeweiligen Paarungen erstellst du dann wieder neue Paarungen, bis du nur noch eine Paarung hast und den Gewinner bestimmen kannst.
Wenn du dir dann im Laufe des Turniers alle Listen merkst kannst du auch den gwünschten Output erzeugen.


----------



## devo22 (26. Nov 2011)

EikeB hat gesagt.:


> Ich würde mir auf jedenfall noch mindestens eine Klasse Paarung erstellen, die zwei Teilnehmer enthält und per Zufallszahl einen Gewinner bestimmt.
> Pro Runde hast du eine Liste mit Paarungen. Aus den Gewinnern der jeweiligen Paarungen erstellst du dann wieder neue Paarungen, bis du nur noch eine Paarung hast und den Gewinner bestimmen kannst.
> Wenn du dir dann im Laufe des Turniers alle Listen merkst kannst du auch den gwünschten Output erzeugen.


Danke, das hilft mir schon mal weiter!!!

Hab das mal eben so gemacht:


```
public class Pairings {

String a;
String b;
LinkedList l;
int choice;

public Pairings (String first, String second, LinkedList list) {

a = first;
b = second;
l = list;

    Random r = new Random(); 
    choice = r.nextInt(2);
    
	if(choice==0)
        {
	l.add(a);
	}

        else
        {
	l.add(b);
        }
   }
}
```
Nur ist mir jetzt unklar wie ich die Paarungen aus dem Scanner erstellen soll ...


----------



## devo22 (26. Nov 2011)

habe jetzt in der Tournament-Klasse folgendes noch hinzugefügt, um die Pairings zu gestalten:


```
int i = 0;
	int j = 1;
	LinkedList l1 = new LinkedList();
	
	while (j < n) {
    Pairings p1 = new Pairings(list.get(i), list.get(j), l1);
	i=i+2;
	j=j+2;
	System.out.print(list.get(i) + " : " + list.get(j) + ", ");
	}
	System.out.print(l1);
```
Das funktioniert auch, nur bei der letzten Paarung bekomme ich eine OutofBounds-Exception


----------



## devo22 (27. Nov 2011)

Habe mich jetzt noch mal dazugesetzt - und das Beispiel funktioniert jetzt. Nur leider bin ich damit nicht wirklich zufrieden, weil die Lösung ziemlich umständlich ist. Ich würde das ganze gerne noch um einiges kompakter haben ... hat jemand Verbesserungsvorschläge für mich?


```
import java.util.*;
import java.io.*;

public class Tournament {

  public static void main (String [] args) {
		
	System.out.println("How many teams should participate? 4, 8 or 16?");
	
	Scanner scanner = new Scanner(System.in);
    int n = scanner.nextInt();
	int o = n;
	LinkedList list = new LinkedList();
	String s="";
	
	if (n == 4)
	{
	s = "A B C D";
	}
	
	if (n == 8)
	{
	s = "A B C D E F G H";
	}
	
	if (n == 16)
	{
	s = "A B C D E F G H I J K L M N O P";
	}
	
	System.out.println();
	System.out.println("Participants: ");
	System.out.println(s);
	System.out.println();
	
	Scanner number = new Scanner(s);
	
	while (number.hasNext()) {
	list.add(number.next());
	}

	System.out.println();
	Collections.shuffle(list, new Random());        
	
	int i = 0;
	int j = 1;
	LinkedList l1 = new LinkedList();
	LinkedList l2 = new LinkedList();
	LinkedList l3 = new LinkedList();
	LinkedList l4 = new LinkedList();
	LinkedList pairings1 = new LinkedList();
	LinkedList pairings2 = new LinkedList();
	LinkedList pairings3 = new LinkedList();
	LinkedList pairings4 = new LinkedList();
	
	while (i < n && j < n) {
    Pairings p1 = new Pairings(list.get(i), list.get(j), l1);
	pairings1.add(list.get(i) + " : " + list.get(j) + " ");
	i=i+2;
	j=j+2;
	}
		
	i = 0;
	j = 1;
	n = n / 2;
	Collections.shuffle(l1, new Random());
	
	if (n > 1) {
	while (i < n && j < n) {
    Pairings p1 = new Pairings(l1.get(i), l1.get(j), l2);
	pairings2.add(l1.get(i) + " : " + l1.get(j) + " ");
	i=i+2;
	j=j+2; }
	}
	
	i = 0;
	j = 1;
	n = n / 2;
	Collections.shuffle(l2, new Random());
	
	if (n > 1) {
	while (i < n && j < n) {
    Pairings p1 = new Pairings(l2.get(i), l2.get(j), l3);
	pairings3.add(l2.get(i) + " : " + l2.get(j) + " ");
	i=i+2;
	j=j+2; }
	}
	
	i = 0;
	j = 1;
	n = n / 2;
	Collections.shuffle(l3, new Random());
	
	if (n > 1) {
	while (i < n && j < n) {
    Pairings p1 = new Pairings(l3.get(i), l3.get(j), l4);
	pairings4.add(l3.get(i) + " : " + l3.get(j) + " ");
	i=i+2;
	j=j+2; }
	}
	
	System.out.println("RESULTS:");
	System.out.println();
	
	if (o == 4) {
	System.out.println("WINNER: " + l2.get(0));
	System.out.println("SEMI-FINALS: " + pairings2);
	System.out.println("QUARTER-FINALS: " + pairings1); }
	
	if (o == 8) {
	System.out.println("WINNER: " + l3.get(0));
	System.out.println("FINALS: " + pairings3);
	System.out.println("SEMI-FINALS: " + pairings2);
	System.out.println("QUARTER-FINALS: " + pairings1); }
	
	if (o == 16) {
	System.out.println("WINNER: " + l4.get(0));
	System.out.println("FINALS: " + pairings4);
	System.out.println("SEMI-FINALS: " + pairings3);
	System.out.println("QUARTER-FINALS: " + pairings2);
	System.out.println("ROUND OF 16: " + pairings1); }
	}
	}
```


```
import java.util.*;
import java.io.*;

public class Pairings {

Object a;
Object b;
LinkedList l;
int choice;

public Pairings (Object first, Object second, LinkedList list) {

a = first;
b = second;
l = list;

    Random r = new Random(); 
    choice = r.nextInt(2);
    
	if(choice==0)
    {
	l.add(a);
	}

    else
    {
	l.add(b);
	}
}
}
```


----------



## Marco13 (27. Nov 2011)

Ja, ist eher... schlecht...

EDIT: Vielleicht noch vorneweg: Das ist *KEINE* Empfehlung, etwas derartiges zu machen - das soll lediglich MEINE Interpretation der Aufgabenstellung andeuten!



> Write a program that first accepts a list of players participating in a knock-out tournament.


->

```
setInitialPlayers(listOfPlayers); // List contains 2^n elements, e.g. Strings
```



> Then it shall randomly determine the initial pairings.


Mit einem expliziten Aufruf? Soll die Liste zurückgeliefert werden? Steht nicht dabei. Im Zweifelsfall kann das direkt in 'setInitialPlayers' gemacht werden.



> It shall further accept the results of the individual competitions in any logically possible order.


->

```
setResult(winner, loser); // Two elements from the listOfPlayers
```



> Finally it shall print the result tree in the following form: winner at the top, 2nd line: finals pairing, 3rd line: the 2 semi-finals pairings, etc.


Das Format ist dort Beispielhaft angegeben. Nichts mit "SEMI-FINALS" usw., einfach nur die Player-Strings der jeweiligen Runde zeilenweise...


----------



## emailundlos (29. Nov 2011)

Beim Schach ist es z.B. so, dass nach vorher festgelegten und klar definierten Wettkampfregeln gespielt wird. Welche sind das hier? Ohne Eingabe soll ja jeweilige Sieger ermittelt werden, zufallig, warum?


----------

