Endlosschleife beim Verteilen von Objekten

bennemann8

Mitglied
Hallo zusammen,
ich bin momentan dabei Spieler eines Teams in 2 unterschiedlichen Runden auf Tische zu verteilen.
Es geht um eine Verwaltung für ein Turnier!
Das Turnier kann unterschiedlich strukturiert sein: 0,1, oder 2
0 = 4 Spieler in einem Team (Team mit meisten Punkten gewinnt)
1 = 4 oder 8 Spieler pro Team (Team mit höchstem Ø gewinnt)
2 = 4 oder 8 Spieler pro Team (8er Teams werden in 2x 4er geteilt, Team mit meisten Punkten gewinnt. Die aufgeteilten 8er Teams werden unabhängig voneinander gewertet, allerdings dürfen keine Spieler der beiden Teams gegeneinander spielen, sprich in einer Spielrunden am selben Tisch sitzen).
Ich habe einfach mal ein Testprojekt erstellt. Ich hoffe, dass mir der ein oder andere damit vielleicht helfen kann.

Was passiert:
Die Turniervarianten 0 und 1 passen perfekt! Alles läuft problemlos.
Die Variante 2 klappt nicht 100%ig, wenn das Turnier nur aus 4 Teams besteht, die jeweils 8 Spieler haben.
Da kommt es öfters mal zu Endlosschleifen, oft klappt die Verwaltung auch! Ich muss die Endlosschleife beim Generieren der 2. Spielrunde irgendwie da rausbekommen, nur komm ich echt irgendwie nicht weiter ;/
Die 1. Runde wird auch problemlos erstellt.

Java:
package rundengenerierenteilen;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Random;

/**
 *
 * @author Jakob Bennemann
 */
public class TestKlasse {

    /**
     * Testprojekt, um den richtigen Sourcecode nicht zu zerstören :D
     */
   
    /*
    Aufbau des Turniers:
    - Jedes Team hat entweder 4 oder 8 Spieler
    - Daraus ergeben sich die Anzahl der Tische = Anzahl Teams 8 Spieler * 2 + Anzahl der Teams 4 Spieler
    - 4 Spieler pro Tisch
    - 2 Spielrunden
    - In keiner Runde dürfen 2+ Spieler dessellben Teams gegeneinander spielen
    - 8er Teams werden geteilt in 2x 4er Team (beide Teams werden unabhängig von einander gewertet)
        - keine Spieler der 2x 4er Teams dürfen gegeneinander spielen, da eigentlich gleiches Team
    - Spieler die in Runde 1 bereits gegeneinander gespielt haben, dürfen dies in der 2. Runde nicht und v.v.!
   
    Aufbau Tische/Teams:
    Teams 1-4 besitzen 8 Spieler     Team-IDs: 1,2,3,4,5,6,7,8  denn die Teams werden in 4er geteilt
    Teams 5-8 besitzen 4 Spieler     Team-ID:s 9,10,11,12       denn die Teams haben bereits 4 Spieler
   
    Das 1. 8er Team besteht also aus den IDs: 1,2               dabei hat das Team mit der ID: 2 als mainID: 1
                                                                da das Hauptteam das Team mit der ID: 1 ist
   
    Beispielverteilung:
   
    Tisch 1|   Spieler   |   Team           Tisch 2|   Spieler   |   Team           Tisch 3|   Spieler   |   Team
    ------------------------------          ------------------------------          ------------------------------
    +++++++   Spieler 4    Team 1           +++++++   Spieler 3    Team 1           +++++++   Spieler 1    Team 9 
    +++++++   Spieler 1    Team 5           +++++++   Spieler 3    Team 3           +++++++   Spieler 2    Team 10  
    +++++++   Spieler 2    Team 3           +++++++   Spieler 3    Team 5           +++++++   Spieler 3    Team 11 
    +++++++   Spieler 1    Team 7           +++++++   Spieler 3    Team 11          +++++++   Spieler 4    Team 12 
   
    .....            Die Tische werden          .....
    .....       dann automatisch generiert      .....
   
    */
   
    static ArrayList<Team> teams;                      // Liste der Teams des Turniers
    static ArrayList<Tisch> desksRound1, desksRound2;  // Listen der Tische in Runde 1/2 mit den Spielern
    static HashMap mapping1, mapping2;                 // HashMaps zur Zurordnung der Tische/Spieler in Runde 1/2
    static int tournamentType = 2;                     // Turniertyp 0=4Spieler im Team, 1=4 oder 8 Spieler, wobei die 
                                                       // Durchschnittspunkte gewertet werden, 2=4 oder 8 Spieler pro
                                                       // Team, wobei die 8er Teams in 2x 4er aufgeteilt werden und als 
                                                       // eigenes Team gewertet werden, jedoch immer noch ein Teil des 
                                                       // 8er Teams sind und auch nicht gegen Spieler des anderen
                                                       // 4er Teams spielen dürfen

    public static void main(String[] args){
        teams = new ArrayList<>();                     // Turnierteams initialisieren
        desksRound1 = new ArrayList<>();               // Tische der Runde 1 initialisieren
        desksRound2 = new ArrayList<>();               // Tische der Runde 2 initialisieren
        addTeamsEightPlayers(4);                       // 4 Teams mit 8 Spielern hinzufügen
        //addTeamsFourPlayers(4);                      // 4 Teams mit 4 Spielern hinzufügen
        //ausgabeTeams(getOriginalTeams());              // Ausgabe der Originalteams (8er Teams werden ausgegeben)
        //ausgabeTeams();                                // Ausgabe der Teams im Turnier
                                                       // Hier werden die Teams in 4er Teams ausgegeben, da 8er Teams
                                                       // geteilt wurden (Turniertype=2)
       
        generate1();                                   // Runde 1 passt immer!
        int m = 0;
        while(generate2() == false){m++;}              // HIER KOMME ICH OFT IN EINE ENDLOS-SCHLEIFE, WENN 
                                                       // ICH NUR 4x 8er Teams IM GESAMTEN TURNIER HABE,
                                                       // DIE MUSS WEG!!
        System.out.println("Runde 2 ungültig: " + m + "x");
       
        //ausgabe1();                                  // Ausgabe der Tische in Runde 1
        //ausgabe2();                                  // Ausgabe der Tische in Runde 2
       
        System.out.println("Erstellte Spielrunden regelkonform: " + ((TestKlasse.roundsValid() == true) ? "ja" : "nein"));
    }

    /*
    * Hier werden die 2 Spielrunden auf ihre Richtigkeit hin überprüft, ob diese so überhaupt existieren dürfen, oder
    * ob bspw. Spieler aus demselben Team an einem Tisch sitzen.
    *
    * @return Runden regelkonform generiert
    */
    private static boolean roundsValid() {
        int i = 0;
        for (Tisch r1 : desksRound1) {
            for (Spieler s : r1.getSpieler()) {
                for (Tisch r2 : desksRound2) {
                    for (Spieler s2 : r2.getSpieler()) {
                        if (s.getName().equalsIgnoreCase(s2.getName()) && s.getTeamnummer() == s2.getTeamnummer()) {
                            s.setTischnummerRunde2(r2.getTischnummer());
                            s.setTischnummerRunde1(r1.getTischnummer());
                            s2.setTischnummerRunde2(r2.getTischnummer());
                            s2.setTischnummerRunde1(r1.getTischnummer());
                        }
                    }
                }
            }
        }
        for (Tisch t1 : desksRound1) {
            for (Spieler sp : t1.getSpieler()) {
                for (Tisch t2 : desksRound2) {
                    //System.out.println("Tischnummer: " + sp.getTischnummerRunde2() + " sp:" + sp.getName() + " - tid:" + sp.getTeamnummer());
                    if (sp.getTischnummerRunde2() == t2.getTischnummer()) {
                        //System.out.println(i++ + "test");
                        for (Spieler tSpieler : t2.getSpieler()) {
                            if (tSpieler.getTeamnummer() == sp.getTeamnummer() && !tSpieler.getName().equalsIgnoreCase(sp.getName())) {
                                i++;
                            }
                            if (sp.getTeamnummer() == getTeamByID(tSpieler.getTeamnummer()).getMainID() && getTeamByID(tSpieler.getTeamnummer()).getMainID() != 0) {
                                i++;
                            }
                            if (tSpieler.getTeamnummer() == getTeamByID(sp.getTeamnummer()).getMainID() && getTeamByID(sp.getTeamnummer()).getMainID() != 0) {
                                i++;
                            }
                        }
                    }
                }

            }
        }
        for (Tisch t : desksRound2) {
            for (Spieler sp : t.getSpieler()) {
                ArrayList<Spieler> gegner = new ArrayList<>();
                for (int j = 0; j < 4; j++) {
                    gegner.add(t.getSpieler().get(j));
                }

                gegner.remove(sp);
//                System.out.println("Gegner von: " + sp.getName() + " (" + sp.getTeamnummer() + ")");
//                for (Spieler spieler : gegner) {
//                    System.out.println(spieler.getName() + " - " + spieler.getTeamnummer());
//                }
//                System.out.println("");
                for (Tisch t1 : desksRound1) {
                    if (sp.getTischnummerRunde1() == t1.getTischnummer()) {
                        for (Spieler gegnRunde1 : t1.getSpieler()) {
                            if (!gegnRunde1.getName().equals(sp.getName()) && sp.getTeamnummer() != gegnRunde1.getTeamnummer()) {
                                for (Spieler gegnerListe : gegner) {
                                    if (gegnRunde1.getName().equalsIgnoreCase(gegnerListe.getName()) && gegnRunde1.getTeamnummer() == gegnerListe.getTeamnummer()) {
                                        i++;
                                    }
                                }
                            }
                        }
                    }
                }
                gegner.clear();
            }
        }
        if (i == 0 && desksRound1.size() == desksRound2.size()) {
            return true;
        } else {
            return false;
        }
    }

    /*
    * Hier werden aus den vorhandenen Teams die "Originalteams" wieder zusammengesetzt. Diese Methode wird bei dem
    * 4er/8er Turniertyp (typ=2) benötigt, da hierbei die 8er Teams in 2x 4er Teams geteilt werden, allerdings für die
    * Auswertung trotzdem ein Team bilden und somit auch nicht gegeneinander spielen dürfen.
    *
    *@return Rückgabe der originalen 4er und 8er Teams
    */
    private static ArrayList<Team> getOriginalTeams() {
        ArrayList<Team> teams = new ArrayList<>();
        Team tVorher = null;
        for (Team t : TestKlasse.teams) {
            Team tmp = null;
            if (t.getMainID() == 0) {
                tmp = new Team(t.getTeamID(), t.getTeamname(), t.getMainID(), t.getSpieler());
                teams.add(tmp);
            } else {
                for (Team team : teams) {
                    if (team.getTeamID() == t.getMainID()) {
                        for (Spieler sp : t.getSpieler()) {
                            team.addSpieler(new Spieler(sp.getName(), sp.getTeamnummer()));
                        }
                    }
                }
            }
        }
        return teams;
    }

    /*
    * Hier wird die erste Spielrunde erstellt.
    * 
    *@return Spieler wurden erfolgreich auf die Tische verteilt.
    */
    private static boolean generate1() {
        desksRound1 = new ArrayList();
        mapping1 = new HashMap();
        Random r = new Random();
        ArrayList<Team> tmp = null;
        if (tournamentType == 2) {
            tmp = getOriginalTeams();
        } else {
            tmp = new ArrayList();
            for (Team t : teams) {
                tmp.add(new Team(t.getTeamID(), t.getTeamname(), t.getMainID(), t.getSpieler()));
            }
        }
        //ausgabeTeams(tmp);
        Collections.shuffle(tmp);
        int i = 1;

        while (!tmp.isEmpty()) {
            List<Team> tischTeams = new ArrayList();
            tischTeams.addAll(tmp);
            Collections.shuffle(tischTeams);

            Tisch tisch = new Tisch(i);
            for (int j = 0; j < 4 && !tischTeams.isEmpty(); j++) {
                Team team = null;

                team = findBiggestTeam(tischTeams);

                //System.out.println("Spieler im Team: " + team.getSpieler().size());
                Spieler s = team.getSpieler().get(r.nextInt(team.getSpieler().size()));
                s.setTischnummerRunde1(i);
                mapping1.put(s, tisch);
                tisch.getSpieler().add(s);

                team.getSpieler().remove(s);
                tischTeams.remove(team);
                if (team.getSpieler().isEmpty()) {
                    tmp.remove(team);
                }
            }
            desksRound1.add(tisch);
            i++;
        }
        return true;
    }

    /*
    * Hier wird die zweite Spielrunde erstellt.
    * 
    *@return Spieler wurden erfolgreich auf die Tische verteilt.
    */
    private static boolean generate2() {
        mapping2 = new HashMap();
        desksRound2 = new ArrayList<>();

        List<Team> tmp = new ArrayList();
        if (tournamentType == 2) {
            tmp = getOriginalTeams();
            //System.out.println(tmp.get(0).getSpieler().size() + " -...");
            //System.out.println("größe: " + tmp.size());
        } else {
            for (Team t : TestKlasse.teams) {
                tmp.add(new Team(t.getTeamID(), t.getTeamname(), t.getMainID(), t.getSpieler()));
            }
        }
        int i = 1;
        //System.out.println("test");

        while (!tmp.isEmpty()) {
            List<Team> tischTeams = new ArrayList();
            Collections.shuffle(tmp);
            tischTeams.addAll(tmp);
            Collections.shuffle(tischTeams);

            Tisch tisch = new Tisch(i);
            for (int j = 0; j < 4 && j <= TestKlasse.teams.size(); j++) {
                Team team = findBiggestTeam(tischTeams);
                //System.out.println(team);
//                System.out.println("TeamID: " + team.getTeamID());
                boolean letzteRundeOk = true;
                for (Spieler s : team.getSpieler()) {
                    Tisch letzterTisch = null;
                    if (tournamentType == 2) {
                        for (Tisch r1 : desksRound1) {
                            for (Spieler sp : r1.getSpieler()) {
                                if (sp.getName().equalsIgnoreCase(s.getName()) && sp.getTeamnummer() == s.getTeamnummer()) {
                                    letzterTisch = r1;
                                }
                            }
                        }
                    } else {
                        letzterTisch = (Tisch) mapping1.get(s);
                    }
                    letzteRundeOk = true;
                    for (Spieler sp : tisch.getSpieler()) {
                        if (tournamentType == 2) {
                            for (Spieler spi : letzterTisch.getSpieler()) {
                                if (spi.getName().equalsIgnoreCase(sp.getName()) && spi.getTeamnummer() == sp.getTeamnummer()) {
                                    letzteRundeOk = false;
                                }
                            }
                        } else {
                            if (letzterTisch.getSpieler().contains(sp)) {
                                letzteRundeOk = false;
                            } else {
                                System.out.println(letzterTisch);
                            }
                        }
                    }
                    if (letzteRundeOk) {
                        mapping2.put(s, tisch);
                        tisch.getSpieler().add(s);
                        s.setTischnummerRunde2(i);

                        team.getSpieler().remove(s);
                        tischTeams.remove(team);
                        break;
                    } else {
                        letzteRundeOk = false;
                    }
                }
                if (!letzteRundeOk) {
                    return false;
                }
                if (team.getSpieler().isEmpty()) {
                    tmp.remove(team);
                }
            }
            desksRound2.add(tisch);
            i++;
        }
        return true;
    }

    /*
    * Hilfsmethode, um ein Team bei gegebener Teamnummer zu erhalten.
    *
    *@param teamnummer Teamnummer des Teams
    *
    *@return Team mit der übergebenen Teamnummer
    */
    private static Team getTeamByID(int teamnummer) {
        for (Team t : TestKlasse.teams) {
            if (t.getTeamID() == teamnummer) {
                return t;
            }
        }
        return null;
    }

    /*
    * Hilfsmethode, um das Team mit den meisten Spielern zu erhalten.
    *
    *@param teams Liste der im Turnier vorhandenen Teams
    *
    *@return Team mit der höchsten Anzahl an Spielern
    */
    private static Team findBiggestTeam(List<Team> teams) {
        int max = -1;
        Team team = null;
        for (Team t : teams) {
            if (t.getSpieler().size() > max) {
                team = t;
                max = t.getSpieler().size();
            }
        }
        return team;
    }

    /*
    * Initialisierungsmethode, um eine Anzahl von Teams mit 8 Spielern dem Turnier hinzuzufügen. Hierbei wird das 8er Team
    * direkt in 2x 4er Teams aufgeteilt. Das 2. 4er Team bekommt die Teamnummer des 1. 4er Teams als mainID übergeben.
    *
    *@param anzahl Anzahl an Teams die hinzugefügt werden sollen
    */
    public static void addTeamsEightPlayers(int anzahl) {
        for (int i = 0; i < anzahl * 2; i = i + 2) {
            teams.add(new Team((i + 1), 0));
            teams.add(new Team((i + 2), (i + 1)));
        }
        for (Team t : teams) {
            t.addSpieler(new Spieler("Spieler 1", t.getTeamID()));
            t.addSpieler(new Spieler("Spieler 2", t.getTeamID()));
            t.addSpieler(new Spieler("Spieler 3", t.getTeamID()));
            t.addSpieler(new Spieler("Spieler 4", t.getTeamID()));
        }
    }

    /*
    * Initialisierungsmethode, um eine Anzahl von Teams mit 4 Spielern dem Turnier hinzuzufügen.
    *
    *@param anzahl Anzahl an Teams die hinzugefügt werden sollen
    */
    private static void addTeamsFourPlayers(int anzahl) {
        int nextId = 0;
        if (teams.size() > 0) {
            nextId = teams.get(teams.size() - 1).getTeamID();
        }
        nextId++;

        for (int i = 0; i < anzahl; i++) {
            teams.add(new Team(nextId));
            nextId++;
        }
        for (int i = 0; i < anzahl; i++) {
            teams.get(teams.size() - 1 - i).addSpieler(new Spieler("Spieler 1", teams.get(teams.size() - 1 - i).getTeamID()));
            teams.get(teams.size() - 1 - i).addSpieler(new Spieler("Spieler 2", teams.get(teams.size() - 1 - i).getTeamID()));
            teams.get(teams.size() - 1 - i).addSpieler(new Spieler("Spieler 3", teams.get(teams.size() - 1 - i).getTeamID()));
            teams.get(teams.size() - 1 - i).addSpieler(new Spieler("Spieler 4", teams.get(teams.size() - 1 - i).getTeamID()));
        }
    }

    /*
    * Ausgabe der im Turnier vorhandenen Teams.
    *
    */
    private static void ausgabeTeams() {
        for (Team t : teams) {
            System.out.println("## Team " + t.getTeamID() + " (" + t.mainID + ") ##");
            int i = 1;
            for (Spieler s : t.getSpieler()) {
                System.out.println(i + ". " + s.getName() + " - tID:" + s.getTeamnummer());
                i++;
            }
            System.out.println("");
        }
    }

    /*
    * Ausgabe einer Liste mit Teams 
    *
    *@param teams Liste der Teams, die ausgegeben werden sollen
    */
    private static void ausgabeTeams(List<Team> teams) {
        for (Team t : teams) {
            System.out.println("## Team " + t.getTeamID() + " (" + t.mainID + ") ##");
            int i = 1;
            for (Spieler s : t.getSpieler()) {
                System.out.println(i + ". " + s.getName() + " - tID:" + s.getTeamnummer());
                i++;
            }
            System.out.println("");
        }
    }

    /*
    * Ausgabe der ersten Spielrunde
    */
    private static void ausgabe1() {
        System.out.println("Runde1");
        for (Tisch t : desksRound1) {
            System.out.println("## Tisch " + t.getTischnummer() + " ##");
            int i = 1;
            for (Spieler s : t.getSpieler()) {
                System.out.println(i + ". " + s.getName() + " - tID:" + s.getTeamnummer());
                i++;
            }
            System.out.println("");
        }
    }

    /*
    * Ausgabe der ersten Spielrunde
    */
    private static void ausgabe2() {
        System.out.println("Runde2");
        for (Tisch t : desksRound2) {
            System.out.println("## Tisch " + t.getTischnummer() + " ##");
            int i = 1;
            for (Spieler s : t.getSpieler()) {
                System.out.println(i + ". " + s.getName() + " - tID:" + s.getTeamnummer());
                i++;
            }
            System.out.println("");
        }
    }

}
Java:
package rundengenerierenteilen;


public class Spieler {

    int id;                                     //Datenbank
    public String name = "";
    int teamnummer = -1;
    int punkte1 = 0, punkte2 = 0, gesamtpunkte = 0, outs1 = 0, outs2 = 0, einzelPunkte = 0, einzelOuts = 0;
    private int tischnummerRunde1;
    private int tischnummerRunde2;

    public Spieler(String name, int teamnummer, int id) {
        this.name = name;
        this.id = id;
        this.teamnummer = teamnummer;
    }

    public Spieler(String name, int teamnummer) {
        this.name = name;
        this.teamnummer = teamnummer;
    }

    public Spieler(String name) {
        this.name = name;
    }

    public Spieler() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getTeamnummer() {
        return teamnummer;
    }

    public void setTeamnummer(int teamnummer) {
        this.teamnummer = teamnummer;
    }

    public int getOuts1() {
        return outs1;
    }

    public int getOutsEinzel() {
        return einzelOuts;
    }

    public int getPunkteEinzel() {
        return einzelPunkte;
    }

    public void setOuts1(int outs) {
        this.outs1 = outs;
    }

    public void setOutsEinzel(int outs) {
        this.einzelOuts = outs;
    }

    public void setPunkteEinzel(int punkte) {
        this.einzelPunkte = punkte;
    }

    public int getOuts2() {
        return outs2;
    }

    public void setOuts2(int outs) {
        this.outs2 = outs;
    }

    public int getPunkte1() {
        return punkte1;
    }

    public void setPunkte1(int punkte1) {
        this.punkte1 = punkte1;
    }

    public int getPunkte2() {
        return punkte2;
    }

    public void setPunkte2(int punkte2) {
        this.punkte2 = punkte2;
    }

    public void setGesamtpunkte(int punkte) {
        this.gesamtpunkte = punkte;
    }

    public int getGesamtpunkte() {
        return (this.punkte1 + this.punkte2);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getTischnummerRunde1() {
        return tischnummerRunde1;
    }

    public void setTischnummerRunde1(int tischnummerRunde1) {
        this.tischnummerRunde1 = tischnummerRunde1;
    }

    public int getTischnummerRunde2() {
        return tischnummerRunde2;
    }

    public void setTischnummerRunde2(int tischnummerRunde2) {
        this.tischnummerRunde2 = tischnummerRunde2;
    }
}
Java:
package rundengenerierenteilen;

import java.util.ArrayList;


public class Team {
    
    int teamID;                             //Datenbank
        public int mainID;         // ID des Hauptteams, wichtig für 4/8er mit Teams teilen!!
        int teamnummer;                         //Benutzer
        String teamname, abkz;
        int punkte1 = 0, punkte2 = 0, outs1 = 0, outs2 = 0;
        ArrayList<Spieler> spieler;

        public Team(String teamname, int teamnummer)
        {
            this.teamname = teamname;
            this.teamnummer = teamnummer;
            spieler = new ArrayList<Spieler>();
        }

        public Team(int teamnummer)
        {
            spieler = new ArrayList<Spieler>();
            this.teamnummer = teamnummer;
        }

        public Team(int teamnummer, String teamname, ArrayList<Spieler> spieler)
        {
            this.teamnummer = teamnummer;
            this.teamname = teamname;
            this.spieler = new ArrayList<Spieler>();
            this.spieler.addAll(spieler);
        }

        public Team()
        {
            spieler = new ArrayList<Spieler>();
        }
        
        public Team(int id, int mainID){
            this.teamnummer = id;
            this.mainID = mainID;
            this.spieler = new ArrayList<>();
        }

        public Team(int teamnummer, String teamname, int mainID, ArrayList<Spieler> list)
        {
            this.teamnummer = teamnummer;
            this.teamname = teamname;
            this.mainID = mainID;
            this.spieler = new ArrayList<Spieler>();
            spieler.addAll(list);
        }

        public int getTeamID()
        {
            return teamnummer;
        }

        public void setTeamID(int teamnummer)
        {
            this.teamID = teamnummer;
        }

        public void setTeamnummer(int teamnummer)
        {
            this.teamnummer = teamnummer;
        }
        
        public int getMainID(){return this.mainID;}
        public void setMainID(int m){this.mainID = m;}

        public String getTeamname()
        {
            return teamname;
        }

        public void setTeamname(String teamname)
        {
            this.teamname = teamname;
        }

        public String getAbkz()
        {
            return abkz;
        }

        public void setAbkz(String abkz)
        {
            this.abkz = abkz;
        }

        public int getPunkte1()
        {
            return punkte1;
        }

        public void addSpieler(Spieler spieler)
        {
            this.spieler.add(spieler);
        }

        public void setPunkte1(int punkte1)
        {
            this.punkte1 = punkte1;
        }

        public int getPunkte2()
        {
            return punkte2;
        }

        public void setPunkte2(int punkte2)
        {
            this.punkte2 = punkte2;
        }

        public int getGesamtpunkte()
        {
            return (this.punkte1 + this.punkte2);
        }
        public int getOuts1() { return this.outs1; }
        public int getOuts2() { return this.outs2; }

        public int getOutsGesamt() { return (outs1 + outs2); }

        public void setOuts1(int anzahl) { this.outs1 = anzahl; }
        public void setOuts2(int anzahl) { this.outs2 = anzahl; }


        public ArrayList<Spieler> getSpieler()
        {
            return spieler;
        }

        public void setSpieler(ArrayList<Spieler> spieler)
        {
            this.spieler = spieler;
        }
}
Java:
package rundengenerierenteilen;

import java.util.ArrayList;

public class Tisch {
    private int tischnummer;
        private ArrayList<Spieler> spieler;
        private ArrayList<Spieler> spielerRunde2;
        private ArrayList<Integer> vorhandeneTeams;

        public Tisch(int pT, ArrayList<Spieler> spieler)
        {
            vorhandeneTeams = new ArrayList<Integer>();
            spieler = new ArrayList<Spieler>();
            spieler.addAll(spieler);
            spielerRunde2 = new ArrayList<Spieler>();
            this.tischnummer = pT;
        }

        public Tisch(int pT)
        {
            vorhandeneTeams = new ArrayList<Integer>();
            spieler = new ArrayList<Spieler>();
            spielerRunde2 = new ArrayList<Spieler>();
            this.tischnummer = pT;
        }

        public int getTischnummer()
        {
            return tischnummer;
        }

        public void add(Spieler sp)
        {
            vorhandeneTeams.add(sp.getTeamnummer());
            spieler.add(sp);
        }

        public void add2(Spieler sp)
        {
            vorhandeneTeams.add(sp.getTeamnummer());
            spielerRunde2.add(sp);
        }

        public ArrayList<Spieler> getSpieler()
        {
            return spieler;
        }
}
 

Joose

Top Contributor
Es wäre auch hilfreich zu erfahren wo deine Endlosschleife auftritt. Du hast sehr viele Stellen mit verschachtelten Schleifen, welche sich teilweise vereinfachen lassen sollten.

Ansonsten musst du ja wissen wo deine Endlosschleife auftritt und auch in etwa bei welcher Bedingung die Schleife hätte abgebrochen werden müssen. Einfach immer wieder Zwischenschritte ausgeben lasse auf der Konsole damit man sieht welche speziellen Zustände die Objekte haben.
 

bennemann8

Mitglied
Es sieht so aus, als würde ich keine passende Anzahl an Teams mehr haben, die noch zugeordnet werden können, da sie schon Spieler des Teams am tisch sind, oder Spieler von dem Partner team.
Ich bekomme die genaue Stelle der Endlosschleife irgendwie nicht raus - auch nicht mit Ausgaben zwischen den Schleifen ;/
 

bennemann8

Mitglied
Code:
...
for (int j = 0; j < 4 && j <= TestKlasse.teams.size(); j++) {
                Team team = findBiggestTeam(tischTeams);
                boolean letzteRundeOk = true;
                Collections.shuffle(team.getSpieler());
                for (Spieler s : team.getSpieler()) {
                    Tisch letzterTisch = null;
...
Ich habe jetzt einfach mal die Spieler des Teams welches gerade einen Spieler zum Tisch hinzufügen soll, mit Collections.shuffle() gemischt und es funktioniert deutlich besser.
Wenn ich die Runde 2 in einer Schleife 30.000x generieren lasse, bis sie gültig ist, erhalte ich nun jedes mal eine passende Runde. Zwar dauert das ganze einige Sekunden und die 2. Runde wird im Schnitt 5700-5780x falsch generiert, aber es läuft :)

@Joose ich bin immer offen für Vorschläge, wo sich die Schleifen vereinfachen lassen. Das optimiert bestimmt nochmal die Laufzeit.
 

Joose

Top Contributor
Zum Beispiel:

Java:
        for (Tisch r1 : desksRound1) {
            for (Spieler s : r1.getSpieler()) {
                for (Tisch r2 : desksRound2) {
                    for (Spieler s2 : r2.getSpieler()) {
                        if (s.getName().equalsIgnoreCase(s2.getName()) && s.getTeamnummer() == s2.getTeamnummer()) {
                            s.setTischnummerRunde2(r2.getTischnummer());
                            s.setTischnummerRunde1(r1.getTischnummer());
                            s2.setTischnummerRunde2(r2.getTischnummer());
                            s2.setTischnummerRunde1(r1.getTischnummer());
                        }
                    }
                }
            }
        }

Was soll hier genau gemacht werden?
Für mich schaut es so aus das du für ein und den selben realen Spieler 2 Spielerobjekte erstellst und hier kontrollierst ob die du beiden passenden Spielerobjekte gefunden hast. Wenn ja bekommen beide jeweils eine Tischnummer für Runde 1 bzw. Runde 2 gesetzt. (damit kann man sich schonmal die if Bedingung ersparen)

Außerdem: Sobald du einen Spieler zu einem Tisch hinzufügst solltest du auch die passende Tischnummer des Spielers setzen. Damit wären die 4 verschachtelten for-Schleifen unnötig.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Endlosschleife mit Startbutton starten und Stopbutton stoppen Allgemeine Java-Themen 6
E Gewollte Endlosschleife unterbrechen oder Alternative gesucht Allgemeine Java-Themen 2
H Thread wird willkürlich in der Endlosschleife beendet Allgemeine Java-Themen 8
J Endlosschleife durch wechselseitigen Zugriff zweier Klassen? Allgemeine Java-Themen 2
V fehlermeldung heap space, endlosschleife??? Allgemeine Java-Themen 4
T thread endlosschleife alle 3 sek Allgemeine Java-Themen 9
P java high cpu load wegen endlosschleife Allgemeine Java-Themen 6
A Endlosschleife + Event Allgemeine Java-Themen 7
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
B Mysteriöse Ergebnisse beim Baccarat Programm? Allgemeine Java-Themen 13
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
A Zweite Service Klasse beim Kompilieren Allgemeine Java-Themen 6
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
B Stringmanipulationen beim Dateinamen Allgemeine Java-Themen 8
B Woher kommen die Bildschirmkoordinaten beim java Robot? Allgemeine Java-Themen 14
Alex_99 Programm stürzt beim Aufruf der Funktion ab? Text ausgeben Allgemeine Java-Themen 45
J Mein Frame friert ein beim Uploaden Allgemeine Java-Themen 4
P Selenium Scriipt zeigt Fehler beim Import Allgemeine Java-Themen 3
A Hilfe beim Verständnis Allgemeine Java-Themen 16
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
B Compiler-Fehler Probleme beim Kompilieren mit Jsoup Allgemeine Java-Themen 8
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
yakazuqi Fehler beim Laden. JDA (Java Discord API) Allgemeine Java-Themen 1
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
U Fehler beim Compillieren Allgemeine Java-Themen 13
B neuroph hält beim XOR lernen nicht an Allgemeine Java-Themen 13
bueseb84 Fehler beim Import von Maven Dependencies aus lokalem artifactory Allgemeine Java-Themen 2
J Jasper Report - seltame Meldung beim compilieren Allgemeine Java-Themen 3
J Linux .jar beim Start automatisch ausführen Allgemeine Java-Themen 6
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
V Threads Probleme beim Aufrufen von Methoden einer anderen Klasse (Threads) Allgemeine Java-Themen 14
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
J WARNING: An illegal reflective access operation has occurred, beim Compilieren von JasperReports, was bedeutet das ? Allgemeine Java-Themen 23
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
C Fehler beim Debuggen von Listen Allgemeine Java-Themen 4
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
B Input/Output Probleme beim Ausführen von Shell-Befehlen mit Java Allgemeine Java-Themen 28
J Probleme beim einbinden von Zip4j library Allgemeine Java-Themen 6
T Compiler-Fehler NoClassDefFoundError beim Laden einer Class Allgemeine Java-Themen 11
S Seitenausrichtung beim Drucken Allgemeine Java-Themen 1
RalleYTN Brauche Hilfe beim Run-Length-Decoding Allgemeine Java-Themen 9
R Optimierung beim Vergleichen von 2 Bildern Allgemeine Java-Themen 23
F SQLite mit Java / Probleme beim INSERT Befehl Allgemeine Java-Themen 4
I Fehler beim Ant-Package erstellen mit Java 9 Allgemeine Java-Themen 1
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
M Beim Öffnen Dialog Directory und Filetype definieren Allgemeine Java-Themen 2
G Problem beim GUI Allgemeine Java-Themen 9
A Probleme beim Verstehen einer Aufgabenstellung Allgemeine Java-Themen 11
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
J Konstruktor in JSP beim Kompilieren nicht gefunden Allgemeine Java-Themen 3
perlenfischer1984 Probleme beim Mocken Allgemeine Java-Themen 6
A Fehler beim Aktualisieren JTable Allgemeine Java-Themen 1
D Pivot-Wahl beim QuickSort steigert die Effizienz, eine Lüge??? Allgemeine Java-Themen 17
J-Gallus Erste Schritte Wahrscheinlich Anfänger Fehler beim rechnen. Falsches Ergebnis. Allgemeine Java-Themen 9
U Swing Hilfe beim Quellcode für ein Codierungs-/Decodierungsprogramm Allgemeine Java-Themen 9
Fischkralle Beim Clean Coden an den Schnittstellen geschnitten. Allgemeine Java-Themen 10
H Beim Konstruktor "this" Allgemeine Java-Themen 4
I Problem beim Aufrufen, von Objektmethoden/ -variablen Allgemeine Java-Themen 6
J Interpreter-Fehler Fehler beim Verschlüsseln Invalid AES key length Allgemeine Java-Themen 1
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
Thallius Swing Merkwürdiges Verhalten beim Panel Tausch Allgemeine Java-Themen 3
Tacofan Sound beim öffnen der GUI Allgemeine Java-Themen 8
Z NullPointerException beim Schreiben einer ArrayList in eine Datei Allgemeine Java-Themen 6
V JavaFX Fehler beim Starten einer Jar Allgemeine Java-Themen 7
B Fortschritt beim Schreiben einer Datei ausgeben lassen Allgemeine Java-Themen 7
J JDK installieren Das Jdk funtioniert beim Editor nicht. Allgemeine Java-Themen 3
R Verdrückt beim Sicherheitshinweis Allgemeine Java-Themen 2
M Probleme beim rechnen, bei Zahlen mit führenden Nullen. Allgemeine Java-Themen 7
javampir Input/Output Effizienz beim binären Lesen einer Datei Allgemeine Java-Themen 6
javampir Seltsame Lücken beim Abspielen von Sound Allgemeine Java-Themen 2
RalleYTN JAnsi Warum bleiben die Hintergrundfarben beim Reseten der Konsole? Allgemeine Java-Themen 0
T BufferedImage verändert sich beim Einlsesen Allgemeine Java-Themen 1
E JCuda-0.6.5 Probleme beim ausführen der Datei Allgemeine Java-Themen 0
S Verständnisproblem beim Mocking Allgemeine Java-Themen 8
W JNDI - LDAP - Probleme beim editieren von Usern Allgemeine Java-Themen 0
Athena Programm funktioniert nur beim Debugging korrekt, sonst nicht. Allgemeine Java-Themen 1
N Zahlensysteme umrechnen; Probleme beim Umwandeln Allgemeine Java-Themen 4
K Fehler beim erstellen von .jar Datei Allgemeine Java-Themen 3
M Eclipse Fehler beim Installieren des Plugins "Jigloo" Allgemeine Java-Themen 12
A Eclipse - Fehler beim "RUN" - "Unable to Launch - The selection cannot be launched" Allgemeine Java-Themen 6
G StackoverflowError beim laden einer FXMML Datei Allgemeine Java-Themen 1
L Methoden Methode gibt mir beim verschlüsseln mit RSA 0 bytes aus ? Allgemeine Java-Themen 1
D Selenium WebDriver HtmlUnitDriver Problem beim Automatisieren Allgemeine Java-Themen 1
A Probleme beim auslesen von Quelltext (HTML) Allgemeine Java-Themen 5
D Input/Output Zeilen werden "ignoriert" beim Einlesen aus einer Textdatei Allgemeine Java-Themen 3
L Suchvorschläge beim eingeben einzelner Buchstaben Allgemeine Java-Themen 3
B Compiler-Fehler NullPointerException beim Auslesen von .lang-Datei Allgemeine Java-Themen 3
U Eclipse Java Programm beschädigt .tar.gz dateien beim Entpacken Allgemeine Java-Themen 7
B Fehler beim Auslesen von Einstellungen. Zwei ähnliche Blöcke, nur eins geht. Allgemeine Java-Themen 5
P Auf die Anzahl der Joins achten beim WS design Allgemeine Java-Themen 1
reibi Classpath Classpath Variable beim Tomcat Allgemeine Java-Themen 2
H JUnit Fehler beim Compilieren - erledigt Allgemeine Java-Themen 0

Ähnliche Java Themen

Neue Themen


Oben