Transcript PowerPoint
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 20.9.2012
Vesa Ollikainen & Outi Grotenfelt 2
Esimerkki: java.lang.String-luokka
Luokka
String
toteuttaa merkkijonotyypin sisältää merkkijonojen käsittelyoperaatioita.
20.9.2012
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) { String alkuosa, loppuosa, kokonaan; System.out.print("Anna alkuosa: "); alkuosa = lukija.nextLine(); System.out.print("Anna loppuosa: "); loppuosa = lukija.nextLine(); run: Anna alkuosa: MunAlku Anna loppuosa: ToinenLoppu Kokonaan: MunAlkuToinenLoppu Pituus: 18 Isoilla: MUNALKUTOINENLOPPU BUILD SUCCESSFUL (total time: 13 seconds) 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.
20.9.2012
Vesa Ollikainen & Outi Grotenfelt
concat
-metodin kutsu voitaisiin korvata
+
-operaattorilla. Kääntäjä muuntaa
+
-operaattorin sen toteuttaviksi metodikutsuiksi automaattisesti 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.
Vesa Ollikainen & Outi Grotenfelt Voidaan tehdä myös vanhemman
StringTokenizer
-luokan avulla .
5 20.9.2012
Esimerkki:
split()
public class Pilkkominen { public static void main(String[] args) { String jono = "Ville:Virtanen:Jokitie 2 A 4:45100:Kouvola"; String pilkotut[]; pilkotut = jono.split(":"); run: Ville Virtanen Jokitie 2 A 4 45100 Kouvola BUILD SUCCESSFUL (total time: 1 seconds) } for (int i=0; i jono jaetaan alijonoihin kaksoispisteen kohdalta. Alijonot tallentuvat taulukkoon pilkotut . Erotinmerkit eivät tule mukaan taulukkoon. 20.9.2012 Vesa Ollikainen & Outi Grotenfelt 6 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 X , Y ja Z sekä sen jälkeen mitkä tahansa kaksi merkkiä. 20.9.2012 Vesa Ollikainen & Outi Grotenfelt 7 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ä. Vesa Ollikainen & Outi Grotenfelt Vastaa oppikirjassa esiteltyä StringBuffer synkronoituva). -luokkaa (JDK 5.0:sta alkaen, nopeampi, ei 8 20.9.2012 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; do{ uusi = lukija.nextLine(); strBuffer.append(uusi); } while (uusi.length()>0); run: tämäonekaluettava System.out.println(strBuffer.toString()); strBuffer.reverse(); System.out.println(strBuffer.toString()); strBuffer.append("XXX"); t � m � onekaluettava avatteulakeno � m � t System.out.println(strBuffer.length()); if (strBuffer.length()>= 3) 20 ava***tteulakeno � m � tXXX strBuffer.insert(3, "***"); System.out.println(strBuffer.toString()); } BUILD SUCCESSFUL (total time: 23 seconds) } Esimerkissä luetaan merkkijono, käännetään se, lisätään loppuun merkkijono XXX ja lisätään merkkijonon keskelle (positiosta 3 alkaen) merkkijono *** . 20.9.2012 Vesa Ollikainen & Outi Grotenfelt 9 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 – notaation staattiset metodit ja muuttujat siten että niihin voi viitata ilman luokkanimeä. Math.PI tilalla voidaan käyttää notaatiota PI . 20.9.2012 Vesa Ollikainen & Outi Grotenfelt 10 java.util-pakkaus sisältää monia hyödyllisiä luokkia. Date ajan esittämiseen Calendar Scanner päivämäärille syötteiden lukemiseen. Scanner -luokan avulla voidaan lukea eri tyyppisiä syötteitä käyttäen tyyppikohtaisia metodeja: nextInt() nextDouble() next() nextLine() rivinvaihdon lukee lukee int -tyypisen double syötteen -tyyppisen syötteen lukee String -tyyppisen syötteen lukee loput rivistä ( String ) ja 20.9.2012 Vesa Ollikainen & Outi Grotenfelt 11 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. 20.9.2012 Vesa Ollikainen & Outi Grotenfelt 12 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. 20.9.2012 Vesa Ollikainen & Outi Grotenfelt 13 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) set(int, Object) Collection -rajapinta add() clear() hakee alkion korvaa alkion määrittää mm. metodit lisää alkion kokoelmaan poistaa alkiot kokoelmasta 20.9.2012 Vesa Ollikainen & Outi Grotenfelt 14 ArrayList Luotaessa ArrayList -olio liitettävien olioiden tyyppi. on myös määritettävä siihen 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. 20.9.2012 Vesa Ollikainen & Outi Grotenfelt 15 20.9.2012 Vesa Ollikainen & Outi Grotenfelt 16 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 char -tyypin int -tyypin kääreluokka Integer kääreluokka Character . ja 20.9.2012 Vesa Ollikainen & Outi Grotenfelt 17 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. 20.9.2012 Vesa Ollikainen & Outi Grotenfelt 18 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 [email protected]Esimerkki 2:
split()
StringBuilder
-luokka
Esimerkki:
StringBuilder
Math
-luokka ja
static import
java.util
-pakkaus
Esimerkki: Scanner
Tietorakenneluokkia
ArrayList
ArrayList-olion luonnin syntaksi
Alkeistietotyyppien kääreluokat
Esimerkki kääreluokasta
Kääreluokista