Avatar billede VC1 Seniormester
30. april 2022 - 20:26 Der er 11 kommentarer og
2 løsninger

Sidder fast - Kan ikke lure hvordan jeg skal sætte mine matches op..

Jeg har uploaded min problemstilling og kode i linket herunder:

https://www.javaprogrammingforums.com/whats-wrong-my-code/44434-tournament-issue-im-stuck-need-push-right-direction.html

Men kort fortalt så har jeg problemer med at skulle sætte min matches op, ved ikke helt hvordan at jeg skal gå til det.

Måske nogen herinde har nogle bud?
Avatar billede arne_v Ekspert
01. maj 2022 - 02:25 #1
Når du skal matche så laver du vel noget a la:

for(int i = 0; i < teams.size() / 2; i++) {
    matches.add(new Match(teams.get(i), teams(teams.size() - 1 - i));
}
Avatar billede arne_v Ekspert
01. maj 2022 - 02:26 #2
Og hvis det er slå ud turnering så laver du vel en ny liste af hold udfra dem som har vundet.
Avatar billede VC1 Seniormester
02. maj 2022 - 01:29 #3
Tak for dit svar arne...

Jeg tror at jeg hvor du vil hen, havde også lidt luret på den vej med noget for-loop, men ikke helt forstået hvordan jeg skulle komme til resultatet, og gør jeg formentlig stadig ikke.

Jeg tænkte selv på at få fat i ArrayListen og bruge dets index, så jeg altså ved at teamA har (0), men jeg kan simpelthen ikke få hevet dataen hen til den anden klasse.

Planen var nemlig herefter at linke Index til et match
index (0) vs. index (1) eksempelvis og herefter sende dataen til txt fil.

Og ja som du siger være opmærksom på der måske skal laves en ny Arrayliste til dem der går videre, eller også måske tildele dem et ''round'' nummer i txt filen alt efter hvilken runde de spiller 1 for første kamp og 2 såfremt de er gået videre.
Avatar billede arne_v Ekspert
02. maj 2022 - 01:39 #4
Hvis du laver en Match klasse med de 2 teams og et tidspunkt og et resultat.

Saa kan den viste forloekke generere en List<Match> og skal nok pakkes ind i en metode createMatches som tager List<Team> som input og returnerer en List<Match>.

Og saa kan du lave en metode nextRoundTeams der tager en List<Match> som input of returnerer en List<Team> med vinderne.
Avatar billede VC1 Seniormester
02. maj 2022 - 01:57 #5
Tak arne, men det lyder besværligt for >mig<.

Tror jeg prøver at holde det mere simpelt, og så må jeg bare tage nogle flere trin til.

Kan du dog forklare mig hvorfor at jeg ikke kan hente dataen i ArrayListen for teams?
- Jeg har prøvet at lave følgende:

public class Match {
    private static Tournament teams;

    public static void Match() {
        teams = new Tournament();
            ArrayList<Team> getTeams = teams.getTeams();
            System.out.println(getTeams.size()); 
//Size is 0 where it should be two, as I have two teams????
    }
}
Avatar billede VC1 Seniormester
02. maj 2022 - 02:08 #6
Jeg tror jeg løste den, i stedet for at lave et nyt objekt, som jeg naturligvis ikke har noget i sig, så tildelte jeg et argument i metodekaldet som var samme objekt turneringen er lavet på.

    public static void Match(Tournament teams) {
            ArrayList<Team> getTeams = teams.getTeams();
            System.out.println(getTeams.size());  //Size is 2
    }
Avatar billede arne_v Ekspert
02. maj 2022 - 02:37 #7
Generelt vil jeg undgaa for meget static.
Avatar billede VC1 Seniormester
02. maj 2022 - 02:41 #8
Det prøver jeg også, men så virker den ene ikke pga. en anden er static osv. det virker bare som en ond cirkel.

Yderligere troede jeg lige at jeg var super god med den ArrayListe, desværre får jeg den så kun hun med dens memory position og jeg kan ikke få den lavet til toString().

- Er det fordi at jeg roder rundt med toString i den forkerte klasse?

  public String toString(){
        return ArraysList<Team>toString();
    }
Avatar billede arne_v Ekspert
02. maj 2022 - 03:37 #9
Jeg kan jo ikke lave din opgave.

Men her er noget inspiration:

package may;

public class Team {
    private String name;
    public Team(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    @Override
    public String toString() {
        return name;
    }
}


package may;

public enum Result {
    NotPlayed,
    HomeWin,
    AwayWin
}


package may;

public class Match {
    private Team home;
    private Team away;
    private Result result;
    public Match(Team home, Team away) {
        this.home = home;
        this.away = away;
        this.result = Result.NotPlayed;
    }
    public Team getHome() {
        return home;
    }
    public Team getAway() {
        return away;
    }
    public Result getResult() {
        return result;
    }
    public void homeWin() {
        this.result = Result.HomeWin;
    }
    public void awayWin() {
        this.result = Result.AwayWin;
    }
    @Override
    public String toString() {
        return String.format("%s-%s:%s", home, away, result);
    }
}


package may;

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

public class Tournament {
    private List<Team> startTeams;
    private List<Team> activeTeams;
    private List<Match> round;
    private void initActiveTeams() {
        if(activeTeams == null) {
            activeTeams = new ArrayList<Team>(startTeams);
        }
    }
    public Tournament() {
        this.startTeams = new ArrayList<Team>();
        this.activeTeams = null;
        this.round = null;
    }
    public List<Team> getStartTeams() {
        return startTeams;
    }
    public List<Team> getActiveTeams() {
        initActiveTeams();
        return activeTeams;
    }
    public List<Match> getRound() {
        return round;
    }
    public void planRound() {
        initActiveTeams();
        round = new ArrayList<Match>();
        for(int i = 0; i < activeTeams.size() / 2; i++) {
            round.add(new Match(activeTeams.get(i), activeTeams.get(activeTeams.size() - 1 - i)));
        }
    }
    public void processRound() {
        activeTeams = new ArrayList<Team>();
        for(Match m : round) {
            switch(m.getResult()) {
                case NotPlayed:
                    throw new RuntimeException("Round not played");
                case HomeWin:
                    activeTeams.add(m.getHome());
                    break;
                case AwayWin:
                    activeTeams.add(m.getAway());
                    break;
            }
        }
    }
}


package may;

import java.util.Random;

public class Test {
    private static Random rng = new Random();
    public static void main(String[] args) {
        Tournament t = new Tournament();
        t.getStartTeams().add(new Team("A"));
        t.getStartTeams().add(new Team("B"));
        t.getStartTeams().add(new Team("C"));
        t.getStartTeams().add(new Team("D"));
        t.getStartTeams().add(new Team("E"));
        t.getStartTeams().add(new Team("F"));
        t.getStartTeams().add(new Team("G"));
        t.getStartTeams().add(new Team("H"));
        while(t.getActiveTeams().size() > 1) {
            t.planRound();
            System.out.println(t.getRound());
            for(Match m : t.getRound()) {
                if(rng.nextDouble() < 0.5) {
                    m.homeWin();
                } else {
                    m.awayWin();
                }
            }
            t.processRound();
            System.out.println(t.getRound());
        }
        System.out.printf("%s won\n", t.getActiveTeams().get(0).getName());
    }
}
Avatar billede VC1 Seniormester
02. maj 2022 - 03:55 #10
Arne - Første og fremmest så er det super fedt at du overhovedet gider bruge tid på at kommentere, og endda med så uddybende svar som du gør. Jeg tror dog at du misforstår mine spørgsmål, for jeg er ikke ude efter løsninger, men mere et skub i en retning når jeg møder en mur og jeg tydeligvis ikke selv kan finde svaret på Google.
(I know formentlig forkert søge tilgang).
Desværre er du den eneste der faktisk giver lidt reelt input i forhold til de forummer jeg har prøvet.

Jeg lader den være her og siger tak for din hjælp og input, det er/har været værdsat uanset hvad. Jeg vil kigge på din sidste kommentar, såfremt jeg at jeg igen går i stå, men lige nu er mit fokus stadig på toString til ArrayListen så jeg kan forsøge med min egen tilgang ;)

Ha' en god nat/dag og igen tak.
Avatar billede arne_v Ekspert
02. maj 2022 - 04:19 #11
Hvis du studerer min kode vil du se at det ikke er en faerdig loesning men en illustration af det jeg tidligere har forklaret. Og det vil kraeve en del tilpasning til dit problem.

Min kode indeholder brug af toString. Den korte version er at ArrayList har en OK toString og at man kun skal implementere en toString paa det man gemmer i ArrayList.
Avatar billede arne_v Ekspert
02. maj 2022 - 19:49 #12
Nogle gange kan det godt være svært at ramme helt rigtigt med et svar. Jeg er mest til enten den korte verbale beskrivelse eller til et forsimplet køreklart eksempel. Det sidste har den forskel at læserne (ikke kun spørgsmålsstilleren men også andre senere) kan præve at køre det, prøve at rette i det og eksperimentere med varianter.
Avatar billede arne_v Ekspert
02. maj 2022 - 19:55 #13
Med hensyn til forum'er så er eksperten.dk vel det eneste danske forum som er tilbage efter at udvikleren.dk stoppede.

Er man gammeldags kan man bruge usenet og comp.lang.java.programmer, men der render du også ind i mig. :-)

Men ellers bruger de fleste Stackoverflow - de har også mange dygtige Java folk (Jon Skeet, BalusC etc.). Men de er nok lidt vanskelige med hensyn til spørgsmål og svar - de foretrækker ret præcise spørgsmål og svar. Jeg bruger f.eks. ikke Stackoverflow.
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