⌛⌛ Elokuvadata virtana¶
Aseta vastauksesi paikallisen tietovarastosi round8/streams-hakemistossa tiedostoihin
Movie.java ja MovieAnalytics.java. Etätietovaraston vastaavassa hakemistossa on
saatavilla testimateriaalia.
Tässä tehtävässä harjoitellaan Javan funktionaalisia virtoja ja rajapintoja. Tarkoituksena on
toteuttaa luokka MovieAnalytics, joka tarjoaa funktioita elokuvadatan lukemiseen tiedostosta
ja datan prosessointiin Javan virroilla. Tämän lisäksi toteutetaan yksinkertainen elokuvien tietojen
esittämiseen sopiva luokka Movie.
Toteuta nämä tarkemmin ottaen seuraavasti:
Luokan
Moviejulkiset ominaisuudet:Rakennin
Movie(String title, int releaseYear, int duration, String genre, double score, String director), joka alustaa oliolle rakentajan parametrien mukaiset elokuvan tiedot: nimi, julkaisuvuosi, kesto, lajityyppi, arvioiden keskiarvo ja ohjaaja.Lukufunktiot näille tiedoille:
getTitle(),getReleaseYear()ja niin edelleen.
Luokan
MovieAnalyticsjulkiset ominaisuudet:Rakennin
MovieAnalytics(), joka luo tyhjän säiliön elokuville. Tehtävän tarpeisiin riittää hyvinMovie-tyyppisiä alkioita säilövä lista.Staattinen jäsenfunktio
Consumer<Movie> showInfo(), joka palauttaa rajapinnanConsumer<Movie>toteuttavan olion, jonka funktioaccept(Movie t)tulostaa elokuvanttiedot yhdelle riville muodossa “title (By director, releaseYear)”. Tuloste päättyy rivinvaihtoon. Näet tulosteen muodon tarkemmin mallitulosteista.Jäsenfunktio
void populateWithData(String fileName), joka lukee elokuvadatan parametrin nimeämästä tiedostosta.Tiedoston oletetaan koostuvan muotoa
"title;releaseYear;duration;genre;score;director"olevista riveistä. Kukin yksittäinen rivi sisältää siten samat tiedot, jotkaMovie-luokan rakentaja saa parametriarvoina.Voit pilkkoa rivin yksittäisiksi tiedoiksi
String-luokansplit-metodilla käyttäen katkaisukohtana puolipistettä. Osa tiedoista pitää muuntaa pilkkomisen jälkeen sopivien lukutyyppien arvoiksi.
Jäsenfunktio
Stream<Movie> moviesAfter(int year), joka palauttaa virtana kaikki elokuvat, joiden julkaisuvuosi onyeartai myöhempi.Jäsenfunktio
Stream<Movie> moviesBefore(int year), joka palauttaa virtana kaikki elokuvat, joiden julkaisuvuosi onyeartai aikaisempi.Jäsenfunktio
Stream<Movie> moviesBetween(int yearA, int yearB), joka palauttaa virtana kaikki elokuvat, joiden julkaisuvuosi on vuosienyearAjayearBvälissä siten, että myösyearAjayearBluetaan osaksi väliä.Jäsenfunktio
Stream<Movie> moviesByDirector(String director), joka palauttaa virtana kaikki tietyn ohjaajandirectorohjaamat elokuvat.
Kaikkien edellämainittujen virran palauttavien funktioiden tulee palauttaa virta, joka
luettelee elokuvat julkaisuvuoden mukaan kasvavassa järjestyksessä. Samana vuonna julkaistut
elokuvat luetellaan nimiensä järjestyksessä String-tyyppisten olioiden oletusjärjestystä
käyttäen.
Virran palauttamisessa ei ole sinänsä mitään erityisempää: palauta virta, 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 virran voisi palauttaa lauseella return Arrays.stream(ia).distinct().sorted();.
Tämän virran vastaanottaja saisi luettua kyseisestä virran arvot 1, 2, 4 ja 5.
Toteutuksen testaus¶
Voit testata luokkiasi tiedostossa MovieTest.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 MovieTest input1.txt,
java MovieTest input2.txt ja java MovieTest input3.txt. Suoritusten pitäisi tuottaa
tiedostoissa output1.txt, output2.txt ja output3.txt annetut tulosteet.
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.