Avatar billede VC1 Seniormester
07. april 2022 - 08:14 Der er 11 kommentarer og
1 løsning

2D / multidimensionel array virker ikke korrekt

Jeg har lavet en switch case i en anden klasse, som aktiverer
Team.teamData() i nedenstående klasse...
- Det virker dog bare ikke som ønsket, jeg vil have at i første array har jeg mine hold og i andet array holdets spillere (max 5), men bliver ved med at kan tage 9 og følger ikke min IF statement. Nogen bud på hvorfor?

UserInput.Menu() er blot min menu med switch cases
og
getUserInput er følgende
  public static String getUserInput(String msg) {
        System.out.print(msg);
        Scanner scan = new Scanner(System.in);
        String input = scan.nextLine();
        return input;
    }


import java.util.ArrayList;

public class Team {

  // private static ArrayList<String> team = new ArrayList<>();
  // private static ArrayList<String> teamMember = new ArrayList<>();
    private static int teamCount = 0;
    private static int memberCount = 0;

    private static String[][] teamAndMembers = new String[8][5];

    public static void teamData() {
        if (teamCount >= 4) {
            UserInput.menu();
        }
        String teamName = UserInput.getUserInput("Du har indtastet " + teamCount +" hold\nIndtast holdets navn: ");
        teamAndMembers[teamCount][memberCount] = teamName;
        teamCount++;
        memberData();

    }

    public static void memberData() {
        String teamMembers = UserInput.getUserInput("Indtast spillernavne, én af gangen: ");
        teamAndMembers[teamCount][memberCount] = teamMembers;
        if(memberCount >= 2 && UserInput.getUserInput("\n****Afslut med Q når alle er registreret.****\nIndtast spillernavne, én af gangen: ").equalsIgnoreCase("Q")){
            UserInput.menu();
        } if (memberCount >= 5) {
            UserInput.menu();
        }
        memberCount ++;
        memberData();
        }
    }
Avatar billede arne_v Ekspert
07. april 2022 - 15:05 #1
memberCount bliver ikke nulstillet naar du starter paa et nyt team.
Avatar billede arne_v Ekspert
07. april 2022 - 15:09 #2
Men efter min mening boer du aendre designet. Det der er ikke saerligt objekt orienteret.

Jeg tænker 3 klasser Liga, Team, Player.

public class Liga {
    private List<Team> teams;
    ...
}

public class Team {
    private String name;
    private List<Player> players;
    ...
}

public class Player {
    private String name;
    ...
}
Avatar billede arne_v Ekspert
07. april 2022 - 16:18 #3
Demo:


import java.util.ArrayList;
import java.util.List;

public class Liga {
    private List<Team> teams;
    public Liga() {
        this.teams = new ArrayList<Team>();
    }
    public List<Team> getTeams() {
        return teams;
    }
}



import java.util.ArrayList;
import java.util.List;

public class Team {
    private String name;
    private List<Player> players;
    public Team(String name) {
        this.name = name;
        this.players = new ArrayList<Player>();
    }
    public String getName() {
        return name;
    }
    public List<Player> getPlayers() {
        return players;
    }
}



public class Player {
    private String name;
    public Player(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}



import java.util.Scanner;

public class IO {
    private static Scanner scan = new Scanner(System.in);
    private static String readWithPrompt(String pmt) {
        System.out.printf("%s: ", pmt);
        return scan.nextLine();
    }
    public static Liga input(int numteams, int numplayersperteam) {
        Liga lo = new Liga();
        for(int i = 0; i < numteams; i++) {
            String teamname = readWithPrompt("Team name");
            Team t = new Team(teamname);
            lo.getTeams().add(t);
            for(int j = 0; j < numplayersperteam; j++) {
                String playername = readWithPrompt("Player name");
                Player p = new Player(playername);
                t.getPlayers().add(p);
            }
        }
        return lo;
    }
    public static void dump(Liga lo) {
        for(Team t : lo.getTeams()) {
            System.out.printf("%s:\n", t.getName());
            for(Player p : t.getPlayers()) {
                System.out.printf("  %s\n", p.getName());
            }
        }
    }
}



public class Test {
    public static void main(String[] args) {
        Liga lo = IO.input(2, 3);
        IO.dump(lo);
    }
}
Avatar billede VC1 Seniormester
23. april 2022 - 23:28 #4
Hej Arne,

Tak for dit svar, undskyld min sene tilbagemelding jeg har været bundet op af henholdsvis arbejde og sygdom.

Jeg har kigget lidt på dit bud, og du har ret i at det slet ikke var objektorienteret, men troede lige jeg kunne være lidt smart med en 2D array - Desværre ikke.

Dog forstår jeg ikke helt din demo, hvordan jeg får ''linked'' spillerne til et givent hold sådan så at hvis/når jeg ønsker at lave en test println på hold1 så kommer alle spillerne også med.
Avatar billede VC1 Seniormester
24. april 2022 - 00:00 #5
Det er også muligt at du har lavet den alt for advanceret til mig, så jeg derfor faktisk ikke helt forstår den.
- Jeg er virkelig NYBEGYNDER i programmering.
Avatar billede arne_v Ekspert
24. april 2022 - 00:50 #6
Team indeholder en liste af Player's.

Og du kan udskrive et holds spillere med en for loop ligesom i dump metoden ovenfor.

Hvis du bare vil kunne udskrive et Team objekt og få spillerne udskrevet skal du override toString metoden på Team klassen.
Avatar billede arne_v Ekspert
24. april 2022 - 00:51 #7
Eksemplet i #3 er ret basal Java.

Det betyder iukke at det er nemt at forstå forbegyndere, men det er nok svært at lave simplere objekt orienteret.
Avatar billede VC1 Seniormester
24. april 2022 - 23:41 #8
Du har helt ret Arne, det var blot mig som ikke var helt skarp da jeg læste din kode fordi jeg prøvede at tage brudstykker af din og implementere i stedet for at kigge på det hele samlet.

Jeg har ændret lidt navne på tingene så de giver mere mening for mig og samtidig prøvet at gøre antallet af spillere dynamisk, desværre oplever jeg problemer med at efter beskeden om ''Hvor mange spillere er der på holdet?'' bliver stillet og besvaret, så skriver den Player name: Player name: og dermed misser én spiller. Kan du lure hvorfor?

public static Tournament input(int numTeams) {
        Tournament tournament = new Tournament();
        for(int i = 0; i < numTeams; i++) {
            String teamName = readUserInput("Team name: ");
            Team team = new Team(teamName);
            tournament.getTeams().add(team);

            System.out.println("Hvor mange spillere er der på holdet?");
            int numPlayersPerTeam = scan.nextInt();

            //FEJL - Spørg om navn to gange og misser dermed en player
            for(int j = 0; j < numPlayersPerTeam; j++) {
                String playerName = readUserInput("Player name: ");
                Player player = new Player(playerName);
                team.getPlayers().add(player);
            }
        }
        return tournament;
    }
Avatar billede arne_v Ekspert
25. april 2022 - 01:09 #9
Jeg gætter på at scan.nextInt og readUserInput ikke arbejder godt sammen.

Prøv:

System.out.println("Hvor mange spillere er der på holdet?");
int numPlayersPerTeam = scan.nextInt();

->

int numPlayersPerTeam = Integer.parseInt(readUserInput("Hvor mange spillere er der på holdet?"));
Avatar billede VC1 Seniormester
25. april 2022 - 01:15 #10
Og det var lige præcis det der skulle til, nu har jeg også kun brugt 3 timer på at finde ud af hvad jeg skulle stille op der.

Nu må jeg så se om jeg kan komme i mål med resten af projektet...
Avatar billede VC1 Seniormester
25. april 2022 - 01:16 #11
Mange tak for din tid og uvurderlige hjælp...!
Avatar billede arne_v Ekspert
25. april 2022 - 01:30 #12
Scanner klassen blev tilføjet til Java i version 1.5 (5 efter det nye nummer system)  i 2004.

Jeg har aldrig kunnet lide den. Der er for mange uventede effekter.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester