Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Standardi- ja tietorakenneluokkia
Standardi- ja tietorakenneluokkia Javan API, ArrayList Ohjelmointirajapinta (Application Programming Interface, API) tarjoaa ohjelmistokehittäjille luokkia rajapintoja Dokumentaatio Sun Microsystemsin sivuilla: http://download.oracle.com/javase/1,5.0/docs/api/ APIs Dokumentaatio sisältää pakkausten ja niiden luokkien kuvauksen. Esim. pakkauksista: java.lang sisältää kielen ytimen javax.swing sisältää käyttöliittymäkomponentteja Vesa Ollikainen & Outi Grotenfelt 2
Esimerkki: java.lang.string-luokka Luokka String toteuttaa merkkijonotyypin sisältää merkkijonojen käsittelyoperaatioita. Vesa Ollikainen & Outi Grotenfelt 3
Esimerkki: String-luokka package testiprojekti; import java.util.*; public class Sanat { public static Scanner lukija = new Scanner(System.in); public static void main(string[] args) { run: Anna alkuosa: MunAlku Anna loppuosa: ToinenLoppu Kokonaan: MunAlkuToinenLoppu Pituus: 18 Isoilla: MUNALKUTOINENLOPPU BUILD SUCCESSFUL (total time: 13 seconds) } String alkuosa, loppuosa, kokonaan; System.out.print("Anna alkuosa: "); alkuosa = lukija.nextline(); System.out.print("Anna loppuosa: "); loppuosa = lukija.nextline(); kokonaan = alkuosa.concat(loppuosa); System.out.println("Kokonaan: "+kokonaan); System.out.println("Pituus: "+kokonaan.length()); System.out.println("Isoilla: "+kokonaan.touppercase()); Esimerkissä metodit concat() } ja touppercase() palauttavat viittaukset uusiin olioihin, jotka metodi luo. concat-metodin kutsu voitaisiin korvata +-operaattorilla. Kääntäjä muuntaa +-operaattorin sen toteuttaviksi metodikutsuiksi automaattisesti Vesa Ollikainen & Outi Grotenfelt 4
split()-metodi String-luokan split()-metodi pilkkoo merkkijonon osiin erotinlausekkeen esiintymien kohdalta. Erotinlauseke ilmaistaan ns. säännöllisenä lausekkeena. Säännöllisissä lausekkeissa: piste (.)täsmää mihin tahansa merkkiin hakasulkeissa ([]) esitetään vaihtoehtoiset merkit asteriski (*) täsmää mihin tahansa merkkijonoon. Voidaan tehdä myös vanhemman StringTokenizer-luokan avulla. Vesa Ollikainen & Outi Grotenfelt 5
public class Pilkkominen { Esimerkki: split() public static void main(string[] args) { String jono = "Ville:Virtanen:Jokitie 2 A 4:45100:Kouvola"; String pilkotut[]; run: Ville Virtanen Jokitie 2 A 4 45100 Kouvola BUILD SUCCESSFUL (total time: 1 seconds) Merkkijono jono jaetaan alijonoihin kaksoispisteen kohdalta. Alijonot tallentuvat taulukkoon pilkotut. Erotinmerkit eivät tule mukaan taulukkoon. } } pilkotut = jono.split(":"); for (int i=0; i<pilkotut.length; i++) System.out.println(pilkotut[i]); Vesa Ollikainen & Outi Grotenfelt 6
Esimerkki 2: split() public class Pilkkominen { } public static void main(string[] args) { } String jono = "X00MieleniY15minunYaatekeviZ99aivoniY88ajatteleviZ14lähteäni"; String pilkotut[]; pilkotut = jono.split("[xyz].."); for (int i=0; i<pilkotut.length; i++) System.out.println(pilkotut[i]); run: Mieleni minun tekevi aivoni ajattelevi Lähteäni BUILD SUCCESSFUL (total time: 1 seconds) Tässä erottimena on jokin kirjaimista X, Y ja Z sekä sen jälkeen mitkä tahansa kaksi merkkiä. Vesa Ollikainen & Outi Grotenfelt 7
StringBuilder-luokka StringBuilder-luokkaa käytetään muuttuvan mittaisten merkkijonojen käsittelyyn. Sisältää metodeja dynaamisille merkkijonoille: append() liittää merkkijonon loppuun. insert() liittää merkkijonon annettuun positioon. Oliolle on varattu kapasiteetti, jota lisätään ajonaikaisesti, jos osoitettu kapasiteetti ei riitä. Vastaa oppikirjassa esiteltyä StringBuffer-luokkaa (JDK 5.0:sta alkaen, nopeampi, ei synkronoituva). Vesa Ollikainen & Outi Grotenfelt 8
Esimerkki: StringBuilder import java.util.*; public class SBKokeilu { public static Scanner lukija = new Scanner(System.in); public static void main(string[] args) { StringBuffer strbuffer = new StringBuffer(); String uusi; run: tämäonekaluettava t m onekaluettava avatteulakeno m t 20 ava***tteulakeno m txxx BUILD SUCCESSFUL (total time: 23 seconds) do{ uusi = lukija.nextline(); strbuffer.append(uusi); } while (uusi.length()>0); System.out.println(strBuffer.toString()); strbuffer.reverse(); System.out.println(strBuffer.toString()); strbuffer.append("xxx"); System.out.println(strBuffer.length()); if (strbuffer.length()>= 3) strbuffer.insert(3, "***"); System.out.println(strBuffer.toString()); Esimerkissä luetaan merkkijono, käännetään se, lisätään loppuun merkkijono XXX ja lisätään merkkijonon keskelle (positiosta 3 alkaen) merkkijono ***. } } Vesa Ollikainen & Outi Grotenfelt 9
Math-luokka ja static import Math-luokka kuuluu java.lang-pakettiin. Paketin julkiset luokat tuodaan käyttöön automaattisesti, joten import-lausetta ei tarvita. Luokka sisältää kokoelman matemaattisia funktioita. pow(), round(), sin(), max(), min(), import static java.lang.math.*; Esimerkin ns. staattinen tuonti hakee luokan java.lang.math staattiset metodit ja muuttujat siten että niihin voi viitata ilman luokkanimeä. notaation Math.PI tilalla voidaan käyttää notaatiota PI. Vesa Ollikainen & Outi Grotenfelt 10
java.util-pakkaus java.util-pakkaus sisältää monia hyödyllisiä luokkia. Date ajan esittämiseen Calendar päivämäärille Scanner syötteiden lukemiseen. Scanner-luokan avulla voidaan lukea eri tyyppisiä syötteitä käyttäen tyyppikohtaisia metodeja: nextint() lukee int-tyypisen syötteen nextdouble() lukee double-tyyppisen syötteen next() lukee String-tyyppisen syötteen nextline() lukee loput rivistä (String) ja rivinvaihdon Vesa Ollikainen & Outi Grotenfelt 11
Esimerkki: Scanner import java.util.*; public class LukijaLuokka { public static void main(string[] args) { Scanner input = new Scanner(System.in); int kokoluku; double liukuluku; String mjono1, mjono2; run: 23 2,456 kukku muru 23 2.456 kukku muru BUILD SUCCESSFUL (total time: 23 seconds) } } kokoluku = input.nextint(); input.nextline(); liukuluku = input.nextdouble(); input.nextline(); mjono1 = input.nextline(); mjono2 = input.nextline(); System.out.println(kokoLuku+" "+liukuluku+" " +mjono1+" "+mjono2); Esimerkissä luetaan ja tulostetaan kokonaisluku, liukuluku ja kaksi merkkijonoa. Kukin edeltää rivinvaihtoa. Vesa Ollikainen & Outi Grotenfelt 12
Tietorakenneluokkia Tietorakenteiden tarkoitus on tallentaa oliot siten, että niiden haku- ja muokkausoperaatiot ovat mahdollisia (ja tehokkaita). Esimerkkejä tietorakenteista: taulukko lista pino puu Java-kielessä on laaja kokoelma valmiita tietorakenneluokkia. Tarkastellaan aluksi esimerkkinä ArrayList-luokkaa. Vesa Ollikainen & Outi Grotenfelt 13
ArrayList ArrayList-tietorakenne on taulukko, jonka koko voi kasvaa dynaamisesti. Järjestelmä varaa ArrayList-oliolle kapasiteetin, jota se kasvattaa tarvittaessa. ArrayList-luokka toteuttaa listaluokille määritetyn List-rajapinnan, joka perii Collection-rajapinnan. List-rajapinta määrittää mm. metodit: get(int) hakee alkion set(int, Object) korvaa alkion Collection-rajapinta määrittää mm. metodit add() lisää alkion kokoelmaan clear() poistaa alkiot kokoelmasta Vesa Ollikainen & Outi Grotenfelt 14
ArrayList-olion luonnin syntaksi ArrayList<Henkilö> henkilöt = new ArrayList<Henkilö>(); Luotaessa ArrayList-olio on myös määritettävä siihen liitettävien olioiden tyyppi. Tätä piirettä kutsutaan geneerisyydeksi. Esimerkissä listaan voidaan tallentaa Henkilö-luokan olioita. Geneerisyys vähentää tyypinmuunnosten tarvetta verrattuna vanhempiin Java-versioihin, jotka eivät tukeneet geneerisyyttä. Luokan alkiot voidaan läpikäydä for-each-rakenteella. Vesa Ollikainen & Outi Grotenfelt 15
Vesa Ollikainen & Outi Grotenfelt 16
Alkeistietotyyppien kääreluokat Alkeistietotyypin muuttujia ei voi käsitellä olioina. Javan tietorakenneluokkiin voidaan kuitenkin tallentaa vain olioita. Muuttujat on muutettava tyyppiä vastaavan ns. kääreluokan olioiksi. Alkeistietotyyppiä vastaavan kääreluokan nimi alkaa isolla alkukirjaimella. esim. tietotyypin double kääreluokka on Double. poikkeuksena int-tyypin kääreluokka Integer ja char-tyypin kääreluokka Character. Vesa Ollikainen & Outi Grotenfelt 17
Esimerkki kääreluokasta ArrayList-rakenteeseen voidaan tallentaa Integer-olioita. int-tyyppiset luvut muutetaan rakenteeseen lisätessä automaattisesti kääreluokkansa edustajiksi (ns. autoboxing). Tulostuslauseessa kutsutaan automaattisesti kääreluokan (Integer) tostring()-metodia. Vesa Ollikainen & Outi Grotenfelt 18
Kääreluokista double luku = 3.2; Double d = new Double(luku); double luku2 = d.doublevalue(); Alkeistietotyypin edustaja voidaan välittää kääreluokan olion konstruktorille. Myös muunnos toiseen suuntaan onnistuu. Kalvosarjan tekijän nimi 19
THANK YOU! www.metropolia.fi/en/ www.facebook.com/metropoliaamk outi.grotenfelt@metropolia.fi