- COMP.CS.140
- 8. Geneeriset tyyppiparametrit
- 8.6 ⌛⌛ Elokuvadata virtana #2
⌛⌛ Elokuvadata virtana #2¶
Aseta vastauksesi paikallisen tietovarastosi round8/streams2-hakemistossa tiedostoihin
Movie.java ja MovieAnalytics2.java. Etätietovaraston vastaavassa hakemistossa on
saatavilla testimateriaalia.
Tässä tehtävässä harjoitellaan Collectors-luokan ja virtojen käyttöä. Tarkoituksena on
toteuttaa luokka MovieAnalytics2, joka luo ryhmiteltyä tietoa elokuvista hyödyntäen esimerkiksi
Collectors-luokan groupingBy-funktiota. Tässä käytetään samaa Movie-luokkaa elokuvien
mallintamiseen kuin edellisessä tehtävässä. Voit käyttää täysin samaa toteutusta.
Luokan MovieAnalytics2 julkiset ominaisuudet:
Rakennin
MovieAnalytics2(), joka luo tyhjän säiliön elokuville. Tehtävän tarpeisiin riittää jälleen hyvinMovie-tyyppisiä alkioita säilövä lista.Jäsenfunktio
void populateWithData(String fileName), joka lukee elokuvadatan parametrin nimeämästä tiedostosta. Funktio on toteutettava virtoja käyttäen (katso alla) siten, että se toimii ulkoisesti samoin kuin edellisen tehtävän vastaava funktio.Jäsenfunktio
void printCountByDirector(int n), joka tulostaaneniten elokuvia ohjannutta ohjaajaa elokuvien määrän mukaisessa laskevassa järjestyksessä. Keskenään yhtä monta elokuvaa ohjanneet ohjaajat asetetaan nimiensä mukaiseen järjestykseenStringluokan oletusjärjestyksen avulla. Kunkin ohjaajan tiedot tulostetaan yhdelle rivinvaihtoon päättyvälle riville muodossa"director: x movies", missäxon ohjaajandirectorohjaamien elokuvien lukumäärä.Jäsenfunktio
void printAverageDurationByGenre(), joka tulostaa kaikki elokuvien lajityypit niihin kuuluvien elokuvien pituuksien keskiarvon mukaisessa järjestyksessä. Keskenään saman keskipituuden omaavat lajityypit asetetaan lajityyppien nimien mukaiseen järjestykseenString-luokan oletusjärjestyksen avulla. Kunkin lajityypin tiedot tulostetaan yhdelle rivinvaihtoon päättyvälle riville muodossa"genre: average", missäaverageon lajityypingenreelokuvien keskipituus kahden desimaalin tarkkuudella.Jäsenfunktio
void printAverageScoreByGenre(), joka tulostaa elokuvien kaikki lajityypit niihin kuuluvien elokuvien arvostelujen keskiarvojen mukaisessa laskevassa järjestyksessä. Keskenään saman arvostelukeskiarvon omaavat lajityypit asetetaan lajityyppien nimien mukaiseen järjestykseenString-luokan oletusjärjestyksen avulla. Kunkin lajityypin tiedot tulostetaan yhdelle rivinvaihtoon päättyvälle riville muodossa"genre: average", missäaverageon lajityypingenreelokuvien arvosteluiden keskiarvo kahden desimaalin tarkkuudella.
Tässä tehtävässä on tarkoitus käyttää virtoja. Tätä pyritään kontrolloimaan tarkistamalla, ettei
tiedostossa MovieAnalytics2.java esiinny yhtään silmukkaa. Tämä rajoitus koskee siten myös
tiedoston lukua: toteuta sekin virran avulla hyödyntäen BufferedReader-luokan
lines()-funktiota, joka luo tiedostoa rivi kerrallaan lukevan virran.
Huomio automaattitarkistimesta
Tarkistin käyttää hyvin yksinkertaista ja tyhmää tapaa silmukan havaitsemiseen: se tutkii,
sisältääkö kooditiedosto avainsanaa “for” tai “while”. Ja vieläpä niin karkealla tavalla, että
esimerkiksi sana “form” täsmätään, koska se alkaa kielletyllä avainsanalla “for”. Kielletty
avainsana kuitenkin saa esiintyä, jos välittömästi sen edessä on piste, joten esimerkiksi
.forEach ja .format sallitaan. Älä näin ollen käytä koodissasi muuttujan tai funktion
nimenä tai edes kommentin osana sanaa, joka alkaa avainsanalla “for” tai “while”.
Toteutuksen testaus¶
Voit testata luokkiasi tiedostossa MovieTest2.java annetun valmiin testiohjelman,
elokuvadataa sisältävien tiedostojen input1.txt, input2.txt ja input3.txt
ja tiedostoissa output1.txt, output2.txt ja output3.txt annettujen esimerkkitulosteiden
avulla. Aseta nämä tiedostot sekä omat luokkatoteutuksesi samaan hakemistoon, käännä ohjelma
esimerkiksi komennolla javac *.java ja suorita testit komennoilla java MovieTest2 input1.txt 10,
java MovieTest2 input2.txt 15 ja java MovieTest2 input3.txt 20. Suoritusten pitäisi tuottaa
tiedostoissa output1.txt, output2.txt ja output3.txt kuvatut tulosteet.
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.