Как структурировать класс, реализующий циклический алгоритм с использованием ООП?

Я работаю над проектом по созданию турнира с использованием алгоритма кругового расписания. Вот класс, в котором я реализовал алгоритм:

public class Matchh {
    public Team teamHome;
    public Team teamAway;
    public int teamHomeGoals;
    public int teamAwayGoals;
    public String matchDay;
    public int noOfTeams;
    public String[][] rounds;
    public String[][] round;

    Team teamList = new Team();

    // no-arg constructor
    Matchh() {
    }

    Matchh(String matchDay, Team teamHome, Team teamAway, int teamHomeGoals, int teamAwayGoals) {
        this.matchDay = matchDay;
        this.teamHome = teamHome;
        this.teamAway = teamAway;
        this.teamHomeGoals = teamHomeGoals;
        this.teamAwayGoals = teamAwayGoals;
    }

    // round robin schedule method
    public String[][] schedule() {
        this.rounds = new String[(teamList.getSize() - 1) * 2][(teamList.getSize() / 2)];
        for (int round = 0; round < (teamList.getSize() - 1) * 2; round++) {
            for (int match = 0; match < (teamList.getSize() / 2); match++) {
                this.teamHome = teamList.getIndex((round + match) % (teamList.getSize() - 1));
                this.teamAway = teamList.getIndex((teamList.getSize() - 1 - match + round) % (teamList.getSize() - 1));
                // Last team stays in the same place while the others rotate around it.
                if (match == 0) {
                    teamAway = teamList.getIndex(teamList.getSize() - 1);
                }
                // from rounds half interchange the position of teams in rounds, to get both home and away matches
                String mixedRounds;
                if (round < (teamList.getSize() - 1)) {
                    mixedRounds = (teamHome + " vs " + teamAway + "  " + teamHome.getGoal() + " - " + teamAway.getGoal());
                } else {
                    mixedRounds = (teamAway + " vs " + teamHome + "  " + teamAway.getGoal() + " - " + teamHome.getGoal());
                }
                rounds[round][match] = mixedRounds;
            }
        }
        return rounds;
    }
}

Метод schedule() отлично работает для отображения расписания турниров для моего Team teamlist, который представляет собой Arraylist, содержащий 12 строк (12 названий команд), ниже приведен класс Team для лучшего понимания. Но, учитывая способ определения вышеуказанного класса, у меня нет возможности вызывать различные свойства в другом классе — например, если мне нужно общее количество голов для конкретной команды, я хотел бы вызвать такой метод, как getTeamHomeGoals() .

Что я пытался сделать, так это разбить метод schedule() на части: определить методы setTeamHome() и setTeamAway(), сгенерировать случайные цели для каждого, создать метод getMatchDay() и построить каждый раунд как объект Matchh, содержащий teamHome, teamAway, teamHomeGoals, teamAwayGoals , matchDay.

пока у меня есть следующие методы (которые не возвращают то, что я намеревался):

 //get match day, matches ar held each week Wednesday and Sunday - we start with a Wednesday
    public String getMatchDay() {
        for (int round = 0; round < (teamList.getSize()-1)*2; round++) {
            if (round%2 == 0){
            this.matchDay = ("Wednesday" +  (round + 2)/2);
            }
            else {
            this.matchDay = ("Sunday" + (round+1)/2);   
            }
        }
        return matchDay;
    }
    
    //teamHome
    public Team getTeamHome(){
        for (int round = 0; round < (teamList.getSize()-1)*2; round++) {
            for (int match = 0; match < (teamList.getSize() / 2); match++) {
                this.teamHome = teamList.getIndex((round + match) % (teamList.getSize() - 1));
            }
        }
        return teamHome;
    }

Пожалуйста, дайте мне несколько советов о том, как я должен структурировать свой класс Matchh, чтобы получить то, что я хочу, то есть связать вместе различные свойства совпадения и, возможно, как сломать метод schedule().

Вот еще Team класс, о котором я упоминал выше

//team class
import java.util.ArrayList;
import java.util.Random;
public class Team {

// the name of the team object
private String name;    

public ArrayList<Team> teamList;

//no-arg constructor, creates the array list of default teams
Team(){
    this.teamList = new ArrayList<Team>();
    
    teamList.add(new Team("Brondby IF"));
    teamList.add(new Team("AaB"));
    teamList.add(new Team("Viborg FF"));
    teamList.add(new Team("Esbjerg"));
    teamList.add(new Team("FC Copenhagen"));
    teamList.add(new Team("Randers FC"));
    teamList.add(new Team("FC Midtjylland"));
    teamList.add(new Team("FC Nordsjaelland"));
    teamList.add(new Team("Odense BK"));
    teamList.add(new Team("AGF Aarhus"));
    teamList.add(new Team("FC Vestsjaelland"));
    teamList.add(new Team("Sonderjyske"));
    
}

//constructor using name
Team(String name){
    this.name =name;
}

//get name of team
public String getName(){
    return name;
}

//get the size of the arrayList
public int getSize(){
    return teamList.size();
}

//get an element at a specific index i
public Team getIndex(int i){
    return teamList.get(i);
}

Спасибо!


person Alina Gabriela    schedule 06.01.2014    source источник
comment
Постарайтесь правильно определить свои классы, прежде чем тратить время на алгоритм. Ваш класс Team не имеет никакого смысла.   -  person Francis    schedule 06.01.2014
comment
да, это я в основном и спрашивал, как это определить?   -  person Alina Gabriela    schedule 06.01.2014
comment
Вероятно, каждый экземпляр Team должен содержать данные только одной команды. Прямо сейчас, каждый раз, когда вы вызываете конструктор Team(), он вызывает себя еще несколько раз, вызывая проблему бесконечной рекурсии! Попробуйте, чтобы класс Team содержал данные только для одной команды, а затем хранил список экземпляров Team в другом месте.   -  person kevinsa5    schedule 07.01.2014


Ответы (2)


Класс команд:

public class Teams {

// the name of the team object
private String teamName;    


Teams (String name){
    this.teamName =name;
    }

public String getName(){
    return teamName;
}

@Override
public String toString(){
    return teamName;
}
}

Класс игры:

public class Game {
public Teams teamHome;
public Teams teamAway;
public String day;

Game(){
}

Класс планировщика (ScheduleGenerator)

public class Scheduler {
public String[][] rounds;

    //  round robin schedule method
    public String[][] schedule(ArrayList<Teams> list){


        this.rounds = new String[(list.size()-1)*2][(list.size() / 2)];

        for (int round = 0; round < (list.size()-1)*2; round++) {
            for (int match = 0; match < (list.size() / 2); match++) {
                Game game = new Game();

                game.teamHome = list.get((round + match) % (list.size() - 1)); 
                game.teamAway = list.get((list.size() - 1 - match + round) % (list.size() - 1)); 

                // Last team stays in the same place while the others rotate around it.
                if (match == 0) {
                    game.teamAway = list.get(list.size() - 1);
                }

                // from rounds half interchange the position of teams in rounds, to get both home and away matches     
                String mixedRounds;
                if (round < (list.size() - 1)) {
                    mixedRounds = ( game.teamHome + " vs " + game.teamAway );
                } else 
                    //interchange the place of teams from half ((teamList.size() - 1)
                {
                    mixedRounds = (game.teamAway + " vs " + game.teamHome);
                }

                rounds[round][match] = mixedRounds;
            }
        }
        return rounds;
    }
}

и класс чемпионата, объединяющий все вместе и отображающий:

import java.util.ArrayList;
import java.util.Arrays;
public class Championship {
public static ArrayList<Teams> teamList =  new ArrayList<Teams>();
public static Scheduler schedule = new Scheduler(); 

Championship(){ 
}

//static ArrayList<Teams> teamList = new ArrayList<Teams>();
public void createDefaultList(int noOfTeams){
    for(int i=0;i<noOfTeams;i++)  
    {  
        Championship.teamList.add(new Teams("Team "+ (i+1)));  
    }
}

public void createDanishLeagueList(){
    teamList.add(new Teams("Brondby IF"));
    teamList.add(new Teams("AaB"));
    teamList.add(new Teams("Viborg FF"));
    teamList.add(new Teams("Esbjerg"));
    teamList.add(new Teams("FC Copenhagen"));
    teamList.add(new Teams("Randers FC"));
    teamList.add(new Teams("FC Midtjylland"));
    teamList.add(new Teams("FC Nordsjaelland"));
    teamList.add(new Teams("Odense BK"));
    teamList.add(new Teams("AGF Aarhus"));
    teamList.add(new Teams("FC Vestsjaelland"));
    teamList.add(new Teams("Sonderjyske"));
}

public static void main(String[] args) {
    Championship championship = new Championship();


    //default teams (team1, team2, etc)
    championship.createDefaultList(4);

    //danish league teams
    //championship.createDanishLeagueList();

    String[][] fixtures = schedule.schedule(teamList);

    // Display the schedule

    for (int i = 0; i < (teamList.size() - 1)*2; i++) {
        if (i%2 == 0){
            System.out.println("Wednesday " +  (i + 2)/2);
        }
        else {
            System.out.println("Sunday " + (i+1)/2);    
        }
        for (int j = 0; j < (teamList.size()/2); j++){
            System.out.println(Arrays.asList(fixtures[i][j]));
            System.out.println();
            }
        }
}
}
person Alina Gabriela    schedule 15.01.2014

Поместите свою логику в другой класс, например ScheduleGenerator, который будет выводить Schedule. Расписание — это класс, который содержит список совпадений. Матч состоит из команды хозяев, команды гостей и даты. Вы также можете добавить поля для подсчета очков и статистики матчей. homeTeam и visitorTeam являются экземплярами класса Team, как и вы. Команда имеет только название в вашем случае, но может иметь список игроков в команде и другие свойства, такие как город, из которого команда. Класс ScheduleGenerator будет выполнять всю логику в статической функции, которая будет создавать все экземпляры совпадений, предоставляя список команд в качестве параметров.

Я чувствую, что если я дам вам больше информации, я буду делать вашу домашнюю работу.

person Francis    schedule 07.01.2014
comment
Спасибо за ваши рекомендации, я старался им следовать - см. ответ выше. Чтобы дополнительно реализовать подсчет очков и статистику - например, забитые и пропущенные голы для каждой команды в каждом матче и афферентный счет, который я мог бы впоследствии суммировать, чтобы получить статистику (положение), я должен создать новый класс, скажем, ScoreCounter, и поместить туда методы, которые я хочу? или я должен сделать это в классе Game? Я снова прошу только рекомендации, а не полное решение - person Alina Gabriela; 15.01.2014
comment
Для подсчета очков вы можете поместить его в игру с чем-то вроде homeScore иawayScore. - person Francis; 21.01.2014
comment
Для полной статистики это может быть сложнее. Вы можете добавить игровую статистику внутри класса Game, а также скомпилировать статистику команды, добавив ссылку на статистику для команды, а также для игрока. Таким образом, вы можете получить всю статистику по сезону для игрока, который отлично выступает в команде и выделиться в матче. Вам понадобится объект или, может быть, больше, чтобы содержать статистику. - person Francis; 21.01.2014