- COMP.CS.140
- 8. Geneeriset tyyppiparametrit
- 8.6 ⌛⌛ Elokuvadata virtana #2
⌛⌛ 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 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 tulostaan
eniten elokuvia ohjannutta ohjaajaa elokuvien määrän mukaisessa laskevassa järjestyksessä. Keskenään yhtä monta elokuvaa ohjanneet ohjaajat asetetaan nimiensä mukaiseen järjestykseenString
luokan oletusjärjestyksen avulla. Kunkin ohjaajan tiedot tulostetaan yhdelle rivinvaihtoon päättyvälle riville muodossa"director: x movies"
, missäx
on ohjaajandirector
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ärjestykseenString
-luokan oletusjärjestyksen avulla. Kunkin lajityypin tiedot tulostetaan yhdelle rivinvaihtoon päättyvälle riville muodossa"genre: average"
, missäaverage
on lajityypingenre
elokuvien keskipituus kahden desimaalin tarkkuudella. Desimaalierottimena käytetään pistettä. Voit muotoilla merkkijonon haluttuun muotoonString
-luokanformat
-jäsenfunktiolla.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ärjestykseenString
-luokan oletusjärjestyksen avulla. Kunkin lajityypin tiedot tulostetaan yhdelle rivinvaihtoon päättyvälle riville muodossa"genre: average"
, missäaverage
on lajityypingenre
elokuvien arvosteluiden keskiarvo kahden desimaalin tarkkuudella. Desimaalierottimena käytetään pistettä. Voit muotoilla merkkijonon haluttuun muotoonString
-luokanformat
-jäsenfunktiolla.
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 onstreams2
.version
-elementin arvo on1.0
.maven.compiler.source
jamaven.compiler.target
-elementtien arvo on17
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 onMovieTest2
, 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.