- COMP.CS.140
- 8. Geneeriset tyyppiparametrit
- 8.6 ⌛⌛ Elokuvadata vs stream #2
⌛⌛ 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 tulostaan
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 (luokanString
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 (luokanString
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 (luokanString
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.