- COMP.CS.140
- 7. Pakkaukset
- 7.5 Pieni tekoälykokeilu
- 7.5.1 ⌛⌛ Maiden tilastoja (JSON)
⌛⌛ Maiden tilastoja (JSON)¶
Tekoälystä
Tässä tehtävässä on toivottavaa käyttää tekoälytyökaluja. Löydät lisää tietoa edellisestä luvusta.
Tehtävän palautus koostuu Maven-projektista. Sijoita pom.xml
-tiedosto paikallisen tietovarastosi
round7/jsoncountries
-hakemistoon ja tee tähän hakemistoon src/main/java
-niminen alihakemisto.
Tee luokkatiedostot Country.java ja CountryData.java ja liitä ne
fi.tuni.prog3.jsoncountries
-nimiseen pakkaukseen. Tiedostojesi tulee olla siten hakemistossa
round7/jsoncountries/src/main/java/fi/tuni/prog3/jsoncountries
. NetBeans osaa luoda tehtävässä
pom.xml
-tiedoston ja hakemistorakenteen automaattisesti, kun annat Maven-projektia luodessasi
oikeat tiedot.
Materiaalien etätietovarastossa on saatavilla aineistoa (round7/jsoncountries
-hakemisto).
Tässä tehtävässä kokeillaan JSON-datan lukemista sekä kirjoittamista käyttäen valmista siihen sopivaa Googlen GSON-kirjastoa: https://github.com/google/gson/blob/master/UserGuide.md. Tämän linkin takaa löytyy tieto, millainen Maven-riippuvuus kirjaston käyttöön tarvitaan.
Tehtävän pohja-aineistona toimii maailmanpankin julkaisemasta avoimesta datasta poimittu otos, joka sisältää tietoa maiden pinta-alasta, väkiluvusta ja bruttokansantuotteesta (GDP, gross domestic product). Tehtävän aineisto on muunnettu ohjelmallisesti XML-muodosta JSON-muotoon. Tämän vuoksi aineiston rakenne on hieman kömpelö: muunnostyökalu on pyrkinyt noudattamaan orjallisesti alkuperäisen XML-tiedoston muotoa.
Sinun tulee toteuttaa luokat Country
ja CountryData
, joilla on ainakin alla kuvatut
ominaisuudet. Voit päättää muut yksityiskohdat itse.
Luokka
Country
tallettaa maan nimen (merkkijono), pinta-alan (double
), väkiluvun (long
) ja bruttokansantuotteen (double
).Määritetty pakkaukseen
fi.tuni.prog3.jsoncountries
.Toteuttaa rajapinnan
Comparable<Country>
niin, että vertailu perustuu maan nimeenString
-luokan luonnollisen järjestyksen mukaisesti.Julkinen jäsenfunktio
String toString()
, joka palauttaa maan tiedot esimerkkitulosteissa kuvatulla tavalla: ensin maan nimi, ja sen alla kahdella välilyönnillä sisennettyinä omilla riveillään pinta-ala, väkiluku ja bruttokansantuote.Double
-arvot yhden desimaalin tarkkuudella. Desimaalierottimena käytetään pistettä. Voit muotoilla merkkijonon haluttuun muotoonString
-luokanformat
-jäsenfunktiolla.Julkiset jäsenfunktiot
String getName()
,double getArea()
,long getPopulation()
jadouble getGdp()
, jotka palauttavat nimiensä kuvaamat tiedot.
Luokka
CountryData
tarjoaa kaksi julkista staattista jäsenfunktiota maita koskevan datan lukemiseen ja kirjoittamiseen JSON-muodossa.Määritetty pakkaukseen
fi.tuni.prog3.jsoncountries
.List<Country> readFromJsons(String areaFile, String populationFile, String gdpFile)
lukee maiden tietoja parametrien nimeämistä JSON-tiedostoista.Tiedostot sisältävät parametrien nimien mukaisesti tietoa maiden pinta-aloista, väkiluvuista ja bruttokansantuotteista. Tiedot ovat siis kolmessa erillisessä tiedostossa.
Päättele tiedostojen rakenne tutkimalla annettuja esimerkkisyötetiedostoja. Kunkin tiedoston rakenne on keskenään samankaltainen: yhtä maata koskevat tiedot ovat
record
-objektin sisällä olevissafield
-objekteissa. Kullakinfield
-objektilla on avaimen “attributes” alla avain “name”, jonka arvosta voit päätellä, minkä tiedon kyseinenfield
-objekti sisältää.Funktio palauttaa jonkinlaisen rajapinnan
List<Country>
toteuttavan listan, joka sisältää luettua dataa kuvaavatCountry
-oliot. Sinun tulee näin ollen yhdistää kolmesta eri JSON-tiedostosta luetut tiedotCountry
-olioihin.
void writeToJson(List<Country> countries, String countryFile)
kirjoittaa listancountries
sisältämienCountry
-olioiden kuvaamat tiedot JSON-muodossa parametrincountryFile
nimeämään tiedostoon.JSON-taulukko, joka sisältää yhden JSON-objektin kutakin maata kohden. Kukin JSON-objekti kuvaa yhden maan tiedot avainten
name
,area
,population
jagdp
alla.Katso tarkka muoto esimerkkitulosteista. Tulostuksen muoto vastaa GSON-kirjaston muotoilua
setPrettyPrinting()
.
Automaattiset sekä alla kuvatut testit olettavat, että teet projektitiedostoosi pom.xml
seuraavat määritykset:
artifactId
-elementin arvo onjsoncountries
.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 onCountryTest
, joka on alla kuvattu valmiina annettu testiluokka.
Toteutuksen testaus¶
Tehtävään on tarjolla kolme testiaineistoa. Alla käytetään merkkiä X
viittaamaan testin
numeroon, joka on 1, 2 tai 3.
Voit testata luokkiasi tiedostossa CountryTest.java
annetun valmiin testiohjelman sekä tapaan
areaX.json
, populationX.json
ja gdpX.json
nimettyjen testiaineistojen, tapaan
outputX.txt
nimettyjen esimerkkitulosteiden sekä tapaan resultX.json
nimettyjen
esimerkkitulostiedostojen avulla.
Aseta CountryTest.java
Maven-projektisi alihakemiston src/main/java
juureen ja muut
tiedostot Maven-projektisi juurihakemistoon pom.xml
tiedoston seuraksi. Edellä on huomattava,
että CountryTest.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 testin X
antamalla komennon
java -jar target/jsoncountries-1.0.one-jar.jar areaX.json populationX.json gdpX.json countriesX.json
projektin juurihakemistossa. Numeroa X
käyttävän suorituksen pitäisi tuottaa vastaavassa
tiedostossa outputX.txt
kuvattu tuloste sekä luoda tiedosto countriesX.json
, jonka sisältö on
identtinen tiedoston resultX.json
kanssa.
A+ esittää tässä kohdassa tehtävän palautuslomakkeen.