⌛⌛ Sarjataulukko

Tehtävään on tarjolla valmiina totetusta testaava luokka sekä testisyötetiedosto student_template_project-repositoriossa hakemistossa Round4/standings. Aseta toteutuksesi tiedostoon Standings.java.

Toteuta luokka Standings, joka ylläpitää sille annettujen otteluiden tulosten perusteella sarjataulukkoa. Joukkueet pelaavat otteluita keskenään, ja joukkue saa kustakin voitosta 3 pistettä, tasapelistä 1 pisteen ja häviöstä 0 pistettä. Tämä siis vastaa esim. jalkapallosta tuttuja sääntöjä.

Luokalla Standings tulee olla seuraavat julkiset jäsenet. Voit suunnitella yksityiset jäsenet vapaasti.

  • Sisäinen staattinen luokka Team, jonka julkiset rakentimet/jäsenet ovat:

    • Rakennin Team(String name): alustaa Team-olion kuvaamaan annetun nimen omaavaa joukkuetta.

    • Jäsenfunktio getName(), joka palauttaa joukkueen nimen.

    • Jäsenfunktiot getWins(), getTies(), getLosses(), getScored(), getAllowed() ja getPoints(). Näistä kukin palauttaa int-arvon, joka kertoo joukkueelle siihen asti kertyneen tiedon (vastaten funktion nimeä).

      • Team-luokan tulisi näin ollen ylläpitää sisäisesti tietoa ainakin joukkueen voittojen, tasapelien, häviöiden, tehtyjen maalien, päästettyjen maalien ja pisteiden määrästä.

  • Rakentimet Standings() ja Standings(String filename): ensimmäinen alustaa tyhjän Standings-olion. Jälkimmäinen alustaa Standings-olion parametrin määrittämästä tiedostosta luetulla otteludatalla. Data luetaan täsmälleen samalla tavalla kuin jäsenfunktio readMatchData (kts. alla).

  • Jäsenfunktio readMatchData(String filename): Lukee otteludataa tiedostosta ja täydentää sisäisen datan huomioimaan myös luetut ottelut. Otteludatan oletetaan koostuvan muotoa “teamNameA\tgoalsA-goalsB\tteamNameB” olevista riveistä. Huomaa, että '\t' tarkoittaa sarkain-merkkiä.

    • Esimerkiksi “Iceland\t3-2\tFinland” kuvaa ottelun, jossa Islanti (Iceland) teki 3 maalia ja Suomi (Finland) 2 maalia.

    • Vihje: operaatio "Iceland\t3-2\tFinland".split(\\t) tuottaa String-taulukon ["Iceland", "3-2", "Finland"]. Lisäksi "3-2".split("-") taulukon ["3", "2"].

  • Jäsenfunktio addMatchResult(String teamNameA, int goalsA, int goalsB, String teamNameB): lisää parametrien kuvaaman ottelutuloksen sisäiseen dataan.

  • Jäsenfunktio getTeams(): palauttaa ArrayList<Team>-listan, joka sisältää kaikki datassa esiintyvät joukkueet siinä järjestyksessä kuin ne esiintyisivät sarjataulukossa (katso printStandings-funktion kuvaus alla).

    • Listassa voi olla suoraan sisäisen datan Team-olioita (toivottavasti olet käyttänyt Team-luokkaa sisäisen datan tallentamisessa…). Tämä on sinänsä turvallista, koska Team-luokalla ei ole dataa muuttavia julkisia funktioita.

    • Edelliseen liittyen huomio, että Standings-luokalla on ympäröivänä luokkana oikeus käsitellä Team-luokan yksityisiä jäseniä. Luokan Standings toteutuksesi voi siten helposti päivittää Team-olioita, vaikka ulkopuoliset eivät voikaan.

  • Jäsenfunktio printStandings(): tulostaa “nätisti” muotoillun sarjataulukon, joka kuvastaa kaikkia toistaiseksi talletettuja ottelutuloksia.

    • Sarjataulukon kukin rivi luettelee joukkueen nimen, pelatut ottelut, voitot, tasapelit, häviöt, tehdyt maalit, päästetyt maalit ja pisteet.

    • Taulukko on järjestetty seuraavien (osin keinotekoisten) sääntöjen mukaan:

      • Ensisijainen sääntö: pisteet. Korkeampi ylempänä.

      • Toissijainen sääntö: maaliero (tehdyt maalit - päästetyt maalit). Suurempi ero ylempänä.

      • Kolmas sääntö: tehdyt maalit. Korkeampi ylempänä.

      • Viimeinen sääntö: joukkueiden nimen aakkosjärjestys (tämä on keinotekoinen sääntö; oikeasti esim. heitettäisiin noppaa?).

    • Muotoile sarjataulukko seuraavasti:

      • Joukkueen nimen perään tulostetaan niin monta välilyöntiä, että nimen ja välilyöntien määrä vastaa pisimmän joukkueen nimen pituutta.

      • Pelatut ottelut, voitot, tasapelit ja häviöt tulostetaan 3 merkin leveydellä (välilyönnit arvon edessä).

      • Tehdyt ja pääsettyt maalit tulostetaan yhtenä merkkijonona muodossa “tehdyt-päästetyt”, ja tulostus tehdään 6 merkin levyisenä (välilyönnit edessä).

      • Pisteet tulostetaan 3 merkin leveydellä (välilyönnit arvon edessä).

      • Sarakkeet erotetaan toisistaan edellisten sääntöjen lisäksi yhdellä välilyönnillä.

Annetun esimerkkitulosteen pitäisi selventää taulukon muodostamista.

Toteutuksen testaus

Voit ensialkuun testata Standings-luokkaasi seuraavalla koodinpätkällä:

Standings standings = new Standings();
standings.addMatchResult("Tonga", 0, 3, "Cook Islands");
standings.addMatchResult("Samoa", 3, 2, "American Samoa");
standings.addMatchResult("Cook Islands", 1, 0, "Samoa");
standings.addMatchResult("Tonga", 1, 2, "American Samoa");
standings.addMatchResult("Tonga", 0, 3, "Samoa");
standings.addMatchResult("American Samoa", 2, 0, "Cook Islands");
standings.printStandings();

Alla on näytetty, mitä koodinpätkän tulisi tulostaa. Taulukon arvot asettuvat yllä kuvattujen tulostusleveyksien käytön ansiosta kohtalaisen mukavasti sarakkeisiin.

Samoa            3   2   0   1    6-3   6
American Samoa   3   2   0   1    6-4   6
Cook Islands     3   2   0   1    4-2   6
Tonga            3   0   0   3    1-8   0

Edellinen oli vain alustava testi. Voit tehdä hieman laajemman testin käyttämällä tiedostossa StandingsTest.java annettua testiohjelmaa, tiedostojen input.txt ja input_b.txt testidataa ja odotetun tuloksen kuvaavaa tiedostoa output.txt. Aseta nämä tiedostot sekä oma luokkatoteutuksesi samaan hakemistoon, käännä ohjelma esim. tapaan javac *.java, ja suorita tapaan java StandingsTest input.txt input_b.txt Mexico 1 1 USA Panama 2 2 Honduras "Costa Rica" 2 1 "Trinidad and Tobago" USA 0 2 "Costa Rica" "Trinidad and Tobago" 1 2 Honduras. Suorituksen pitäisi tuottaa tiedostossa output.txt kuvattu tuloste

A+ esittää tässä kohdassa tehtävän palautuslomakkeen.