- COMP.CS.140
- 8. Geneeriset tyyppiparametrit
- 8.5 ⌛⌛ Elokuvadata vs stream
⌛⌛ Elokuvadata vs stream¶
Aseta vastauksesi tiedostoihin Movie.java ja MovieAnalytics.java hakemistoon Round8/streams. Muista hakea materiaalit ``student_template_project``sta.
Tässä tehtävässä harjoitellaan Javan streameja ja funktionaalisia rajapintoja. Tarkoituksena on
toteuttaa luokka MovieAnalytics
, joka tarjoaa funktioita elokuvadatan lukemiseen tiedostosta
sekä prosessointiin Javan streameilla. Tämän lisäksi toteutetaan yksinkertainen elokuvien tietojen
esittämiseen sopiva luokka Movie
.
Toteuta nämä tarkemmin ottaen seuraavasti:
Luokan
Movie
julkiset ominaisuudet:Rakennin
Movie(String title, int releaseYear, int duration, String genre, double score, String director)
, joka alustaa olion kuvaamaan rakentimen parametrien mukaiset tiedot: elokuvan nimi, julkaisuvuosi, kesto, lajityyppi, arvioiden keskiarvo ja ohjaaja.Lukufunktiot em. tiedoille:
getTitle()
,getReleaseYear()
, jne.
Luokan
MovieAnalytics
julkiset ominaisuudet:Rakennin
MovieAnalytics()
, joka alustaa tyhjän elokuvatietokannan. Tehtävän tarpeisiin riittää esim.Movie
-lista.Staattinen jäsenfunktio
Consumer<Movie> showInfo()
, joka palauttaa rajapinnanConsumer<Movie>
toteuttavan olion, jonka funktioaccept(Movie t)
tulostaa elokuvant
tiedot muodossa “title (By director, releaseYear)\\n
” (katso mallitulosteita).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ä. Eli kukin yksittäinen rivi kuvaa elokuvasta samat tiedot, mitkä luokanMovie
rakennin ottaa parametreina.Suoraviivainen split-operaatio puolipisteen perusteella. Osa tiedoista vain pitää sen jälkeen vielä muuntaa sopivien lukutyyppien arvoiksi.
Jäsenfunktio
Stream<Movie> moviesAfter(int year)
, joka palauttaa streamina kaikki tietokannan elokuvat, joiden julkaisuvuosi onyear
tai myöhempi.Jäsenfunktio
Stream<Movie> moviesBefore(int year)
, joka palauttaa streamina kaikki tietokannan elokuvat, joiden julkaisuvuosi onyear
tai aikaisempi.Jäsenfunktio
Stream<Movie> moviesBetween(int yearA, int yearB)
, joka palauttaa streamina kaikki tietokannan elokuvat, joiden julkaisuvuosi on vuosienyearA
jayearB
välissä (myösyearA
jayearB
luetaan osaksi väliä).Jäsenfunktio
Stream<Movie> moviesByDirector(String director)
, joka palauttaa streamina kaikki tietokannassa olevat parametrindirector
ohjaamat elokuvat.
Kaikkien edellämainittujen streamin palauttavien funktioiden tulee palauttaa sellainen stream, joka
luettelee elokuvat julkaisuvuoden mukaan kasvavassa järjestyksessä. Keskenään saman julkaisuvuoden
elokuvat luetellaan elokuvien nimien järjestyksessä (luokan String
oletusjärjestys).
Streamin palauttamisessa ei ole sinänsä mitään erityisempää: palauta stream, johon on kohdistetty
mahdollisesti tuloksen kannalta tarpeelliset välioperaatiot (mutta ei loppuoperaatiota).
Esimerkiksi listan int[] ia = [1, 2, 5, 4, 2, 5, 4]
yksikäsitteiset alkiot järjestyksessä
luettelevan streamin voisi palauttaa tapaan return Arrays.stream(ia).distinct().sorted();
.
Tämän streamin vastaanottaja saisi luettua kyseisestä streamista arvot 1, 2, 4 ja 5.
Toteutuksen testaus¶
Voit testata luokkiasi tiedostossa MovieTest.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 MovieTest input1.txt
,
java MovieTest input2.txt
ja java MovieTest input3.txt
. Suoritusten pitäisi tuottaa
tiedostoissa output1.txt
, output2.txt
ja output3.txt
kuvatut tulosteet.
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.