Tämä kurssi on jo päättynyt.

⌛⌛ Elokuvadata virtana #2

Tehtävän palautus koostuu Maven-projektista. Sijoita pom.xml-tiedosto paikallisen tietovarastosi round8/streams2-hakemistoon ja tee tähän hakemistoon src/main/java-niminen alihakemisto. Tee luokkatiedostot Movie.java ja MovieAnalytics2.java ja liitä ne fi.tuni.prog3.streams2-nimiseen pakkaukseen. Tiedostojesi tulee olla siten hakemistossa round8/streams2/src/main/java/fi/tuni/prog3/streams2. Etätietovaraston hakemistossa round8/streams2 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ä. Lajityypit, joilla on yhtä suuri arvostelukeskiarvo, 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”.

Automaattiset sekä alla kuvatut testit olettavat, että teet projektitiedostoosi pom.xml seuraavat määritykset:

  • artifactId-elementin arvo on streams2.

  • version-elementin arvo on 1.0.

  • maven.compiler.source ja maven.compiler.target -elementtien arvo on 17 tai pienempi. Tarkistimella on asennettuna Java 17, joten tätä uudempaa versiota ei voi käyttää.

  • Onejar-liitännäisen määritys, jonka mainClass-elementin arvo on MovieTest2, joka on alla kuvattu valmiina annettu testiluokka.

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 MovieTest2.java Maven-projektisi alihakemiston src/main/java juureen ja muut tiedostot Maven-projektisi juurihakemistoon pom.xml tiedoston seuraksi. Edellä on huomattava, että MovieTest2.java ei sisällä pakkausmääritystä, joten sitä ei siksi aseteta syvempään alihakemistoon.

Voit tämän jälkeen kääntää ohjelman komennolla mvn package ja suorittaa testit komennoilla java -jar target/streams2-1.0.one-jar.jar input1.txt 10, java -jar target/streams2-1.0.one-jar.jar input2.txt 15 ja java -jar target/streams2-1.0.one-jar.jar input3.txt 20 projektin juurihakemistossa. Suoritusten pitäisi tuottaa tiedostoissa output1.txt, output2.txt ja output3.txt kuvatut tulosteet.

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

Palautusta lähetetään...