⌛⌛ 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 hyvin Movie-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 tulostaa n eniten elokuvia ohjannutta ohjaajaa elokuvien määrän mukaisessa laskevassa järjestyksessä. Keskenään yhtä monta elokuvaa ohjanneet ohjaajat asetetaan nimiensä mukaiseen järjestykseen String luokan oletusjärjestyksen avulla. Kunkin ohjaajan tiedot tulostetaan yhdelle rivinvaihtoon päättyvälle riville muodossa "director: x movies", missä x on ohjaajan director ohjaamien 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ärjestykseen String-luokan oletusjärjestyksen avulla. Kunkin lajityypin tiedot tulostetaan yhdelle rivinvaihtoon päättyvälle riville muodossa "genre: average", missä average on lajityypin genre elokuvien 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ärjestykseen String-luokan oletusjärjestyksen avulla. Kunkin lajityypin tiedot tulostetaan yhdelle rivinvaihtoon päättyvälle riville muodossa "genre: average", missä average on lajityypin genre elokuvien 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.