⌛⌛ Elokuvadata vs stream #2

Aseta vastauksesi tiedostoihin Movie.java ja MovieAnalytics2.java hakemistoon Round8/streams2. Muista hakea materiaalit ``student_template_project``sta.

Tässä tehtävässä harjoitellaan Collectors-luokan sekä lisää streamien 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 yksinkertaista luokkaa Movie elokuvien esittämiseen kuin edellisessä tehtävässä. Voit käyttää täysin samaa toteutusta.

Luokan MovieAnalytics2 julkiset ominaisuudet:

  • Rakennin MovieAnalytics2(), joka alustaa tyhjän elokuvatietokannan. Tehtävän tarpeisiin riittää jälleen esim. Movie-lista.

  • Jäsenfunktio void populateWithData(String fileName), joka lukee tietokantaan elokuvadataa parametrin nimeämästä tiedostosta.

    • Tiedoston oletetaan koostuvan muotoa “title;releaseYear;duration;genre;score;director” olevista riveistä.

  • Jäsenfunktio void printCountByDirector(int n), joka tulostaa n eniten elokuvia ohjannutta ohjaajaa ohjattujen elokuvien määrän mukaan laskevassa järjestyksessä. Keskenään yhtä monta elokuvaa ohjannutta ohjaajaa asetetaan nimien mukaiseen järjestykseen (luokan String oletusjärjestys). Kukin ohjaaja tulostetaan muodossa “director: x movies”, missä x on kyseisen ohjaajan ohjaamien elokuvien lukumäärä.

  • Jäsenfunktio void printAverageDurationByGenre(), joka tulostaa kaikki tietokannan elokuvien lajityypit niihin kuuluvien elokuvien keskipituuden mukaisessa järjestyksessä. Keskenään saman keskipituuden omaavat lajityypit asetetaan lajityyppien nimien mukaiseen järjestykseen (luokan String oletusjärjestys). Kukin lajityyppi tulostetaan muodossa “genre: average”, missä average on kyseisen lajityypin elokuvien keskipituus kahden desimaalin tarkkuudella.

  • Jäsenfunktio void printAverageScoreByGenre(), joka tulostaa kaikki tietokannan elokuvien lajityypit niihin kuuluvien elokuvien arvosteluiden keskiarvojen mukaan laskevassa järjestyksessä. Keskenään saman arvostelukeskiarvon omaavat lajityypit asetetaan lajityyppien nimien mukaiseen järjestykseen (luokan String oletusjärjestys). Kukin lajityyppi tulostetaan muodossa “genre: average”, missä average on kyseisen lajityypin elokuvien arvosteluiden keskiarvo kahden desimaalin tarkkuudella.

Tässä tehtävässä on tarkoitus käyttää streameja. 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 streamin avulla (hyödyntäen BufferedReader-luokan jäsenfunktiota lines(), joka luo tiedostoa rivi kerrallaan lukevan streamin).

Huomio tarkistimen niinsanotusta “silmukan havaitsemisesta”

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. Eli älä käytä koodissasi muuttujan tai funktion nimenä (tai edes kommentin osasa) sanaa, joka alkaa avainsanalla “for” tai “while”.

Toteutuksen testaus

Voit testata luokkiasi tiedostossa MovieTest2.java annetun valmiin testiohjelman, tiedostojen input1.txt, input2.txt ja input3.txt olevien testidatan, ja tiedostoissa output1.txt, output2.txt ja output3.txt annettujen esimerkkitulosteiden avulla. Aseta nämä tiedostot sekä omat luokkatoteutuksesi samaan hakemistoon, käännä ohjelma esim. tapaan javac *.java, ja suorita testit tapaan 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.