⌛⌛ 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 rajapinnan Consumer<Movie> toteuttavan olion, jonka funktio accept(Movie t) tulostaa elokuvan t 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ä luokan Movie 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 on year tai myöhempi.

    • Jäsenfunktio Stream<Movie> moviesBefore(int year), joka palauttaa streamina kaikki tietokannan elokuvat, joiden julkaisuvuosi on year tai aikaisempi.

    • Jäsenfunktio Stream<Movie> moviesBetween(int yearA, int yearB), joka palauttaa streamina kaikki tietokannan elokuvat, joiden julkaisuvuosi on vuosien yearA ja yearB välissä (myös yearA ja yearB luetaan osaksi väliä).

    • Jäsenfunktio Stream<Movie> moviesByDirector(String director), joka palauttaa streamina kaikki tietokannassa olevat parametrin director 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.