Tämä kurssi on jo päättynyt.

⌛⌛ Elokuvadata virtana

Tehtävän palautus koostuu Maven-projektista. Sijoita pom.xml-tiedosto paikallisen tietovarastosi round8/streams-hakemistoon ja tee tähän hakemistoon src/main/java-niminen alihakemisto. Tee luokkatiedostot Movie.java ja MovieAnalytics.java ja liitä ne fi.tuni.prog3.streams-nimiseen pakkaukseen. Tiedostojesi tulee olla siten hakemistossa round8/streams/src/main/java/fi/tuni/prog3/streams. Etätietovaraston hakemistossa round8/streams 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 Movie julkiset 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 MovieAnalytics julkiset ominaisuudet:

    • Rakennin MovieAnalytics(), joka luo tyhjän säiliön elokuville. Tehtävän tarpeisiin riittää hyvin Movie-tyyppisiä alkioita säilövä lista.

    • Staattinen jäsenfunktio Consumer<Movie> showInfo(), joka palauttaa rajapinnan Consumer<Movie> toteuttavan olion, jonka funktio accept(Movie t) tulostaa elokuvan t tiedot 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, jotka Movie-luokan rakentaja saa parametriarvoina.

      • Voit pilkkoa rivin yksittäisiksi tiedoiksi String-luokan split-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 on year tai myöhempi.

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

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

    • Jäsenfunktio Stream<Movie> moviesByDirector(String director), joka palauttaa virtana kaikki ohjaajan director ohjaamat 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.

Automaattiset sekä alla kuvatut testit olettavat, että teet projektitiedostoosi pom.xml seuraavat määritykset:

  • artifactId-elementin arvo on streams.

  • version-elementin arvo on 1.0.

  • maven.compiler.source ja maven.compiler.target -elementtien arvo on 17 tai pienempi. Tarkistimella on asennettuna Java 17, joten tätä uudempaa versiota ei voi käyttää.

  • Onejar-liitännäisen määritys, jonka mainClass-elementin arvo on MovieTest, joka on alla kuvattu valmiina annettu testiluokka.

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 MovieTest.java Maven-projektisi alihakemiston src/main/java juureen ja muut tiedostot Maven-projektisi juurihakemistoon pom.xml tiedoston seuraksi. Edellä on huomattava, että MovieTest.java ei sisällä pakkausmääritystä, joten sitä ei siksi aseteta syvempään alihakemistoon.

Voit tämän jälkeen kääntää ohjelman komennolla mvn package ja suorittaa testit komennoilla java -jar target/streams-1.0.one-jar.jar input1.txt, java -jar target/streams-1.0.one-jar.jar input2.txt ja java -jar target/streams-1.0.one-jar.jar input3.txt projektin juurihakemistossa. Suoritusten pitäisi tuottaa tiedostoissa output1.txt, output2.txt ja output3.txt annetut tulosteet.

A+ esittää tässä kohdassa tehtävän palautuslomakkeen.

Palautusta lähetetään...