- COMP.CS.140
- 8. Geneeriset tyyppiparametrit
- 8.5 ⌛⌛ Elokuvadata virtana
⌛⌛ 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ää hyvinMovie
-tyyppisiä alkioita säilövä lista.Staattinen jäsenfunktio
Consumer<Movie> showInfo()
, joka palauttaa rajapinnanConsumer<Movie>
toteuttavan olion, jonka funktioaccept(Movie t)
tulostaa elokuvant
tiedot yhdelle riville muodossa “title (By director, releaseYear)
”. Tuloste päättyy rivinvaihtoon. Näet tulosteen muodon tarkemmin mallitulosteista. Olion luomiseksi riittää palauttaaConsumer
-rajapinnan toteuttava lambda: esimerkiksireturn p -> System.out.println(...);
, missä...
on lauseesta tarkoituksella pois jätetty osa.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 onyear
tai myöhempi.Jäsenfunktio
Stream<Movie> moviesBefore(int year)
, joka palauttaa virtana kaikki elokuvat, joiden julkaisuvuosi onyear
tai aikaisempi.Jäsenfunktio
Stream<Movie> moviesBetween(int yearA, int yearB)
, joka palauttaa virtana kaikki elokuvat, joiden julkaisuvuosi on vuosienyearA
jayearB
välissä siten, että myösyearA
jayearB
luetaan osaksi väliä.Jäsenfunktio
Stream<Movie> moviesByDirector(String director)
, joka palauttaa virtana kaikki ohjaajandirector
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 onstreams
.version
-elementin arvo on1.0
.maven.compiler.source
jamaven.compiler.target
-elementtien arvo on17
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 onMovieTest
, 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.