⌛⌛ 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 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.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äaverage
on lajityypingenre
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.