200 likes | 327 Views
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
E N D
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Standardi- ja tietorakenneluokkia
Standardi- ja tietorakenneluokkiaJavan 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
Esimerkki: java.lang.String-luokka • Luokka String • toteuttaa merkkijonotyypin • sisältää merkkijonojen käsittelyoperaatioita. Vesa Ollikainen & Outi Grotenfelt
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(); kokonaan = alkuosa.concat(loppuosa); System.out.println("Kokonaan: "+kokonaan); System.out.println("Pituus: "+kokonaan.length()); System.out.println("Isoilla: "+kokonaan.toUpperCase()); } } Esimerkki: String-luokka • Esimerkissä metodit concat() ja toUpperCase() palauttavat viittaukset uusiin olioihin, jotka metodi luo. run: Anna alkuosa: MunAlku Anna loppuosa: ToinenLoppu Kokonaan: MunAlkuToinenLoppu Pituus: 18 Isoilla: MUNALKUTOINENLOPPU BUILD SUCCESSFUL (totaltime: 13 seconds) concat-metodin kutsu voitaisiin korvata +-operaattorilla. Kääntäjä muuntaa +-operaattorin sen toteuttaviksi metodikutsuiksi automaattisesti Vesa Ollikainen & Outi Grotenfelt
split()-metodi • String-luokansplit()-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
public class Pilkkominen { public static void main(String[] args) { String jono = "Ville:Virtanen:Jokitie 2 A 4:45100:Kouvola"; String pilkotut[]; pilkotut = jono.split(":"); for (int i=0; i<pilkotut.length; i++) System.out.println(pilkotut[i]); } } Esimerkki: split() • Merkkijono jono jaetaan alijonoihin kaksoispisteen kohdalta. • Alijonot tallentuvat taulukkoon pilkotut. • Erotinmerkit eivät tule mukaan taulukkoon. run: Ville Virtanen Jokitie 2 A 4 45100 Kouvola BUILD SUCCESSFUL (totaltime: 1 seconds) Vesa Ollikainen & Outi Grotenfelt
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]); } } • Tässä erottimena on jokin kirjaimista X, Y ja Z sekä sen jälkeen mitkä tahansa kaksi merkkiä. run: Mieleni minun tekevi aivoni ajattelevi Lähteäni BUILD SUCCESSFUL (totaltime: 1 seconds) Vesa Ollikainen & Outi Grotenfelt
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
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); 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()); } } Esimerkki: StringBuilder • Esimerkissä luetaan merkkijono, käännetään se, lisätään loppuun merkkijono XXX ja lisätään merkkijonon keskelle (positiosta 3 alkaen) merkkijono ***. run: tämäonekaluettava t�m�onekaluettava avatteulakeno�m�t 20 ava***tteulakeno�m�tXXX BUILD SUCCESSFUL (total time: 23 seconds) Vesa Ollikainen & Outi Grotenfelt
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(), … • Esimerkin ns. staattinen tuonti hakee luokan java.lang.Math staattiset metodit ja muuttujat siten että niihin voi viitata ilman luokkanimeä. • notaation Math.PItilalla voidaan käyttää notaatiota PI. import static java.lang.Math.*; Vesa Ollikainen & Outi Grotenfelt
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
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; kokoLuku = input.nextInt(); input.nextLine(); liukuLuku = input.nextDouble(); input.nextLine(); mJono1 = input.nextLine(); mJono2 = input.nextLine(); System.out.println(kokoLuku+" "+liukuLuku+" " +mJono1+" "+mJono2); } } Esimerkki: Scanner • Esimerkissä luetaan ja tulostetaan kokonaisluku, liukuluku ja kaksi merkkijonoa. • Kukin edeltää rivinvaihtoa. run: 23 2,456 kukku muru 23 2.456 kukku muru BUILD SUCCESSFUL (totaltime: 23 seconds) Vesa Ollikainen & Outi Grotenfelt
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
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
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
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
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
Kääreluokista • Alkeistietotyypin edustaja voidaan välittää kääreluokan olion konstruktorille. • Myös muunnos toiseen suuntaan onnistuu. double luku = 3.2; Double d = new Double(luku); double luku2 = d.doubleValue(); Kalvosarjan tekijän nimi
THANK YOU! www.metropolia.fi/en/ www.facebook.com/MetropoliaAMK outi.grotenfelt@metropolia.fi