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

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

X

,

Y

ja

Z

sekä sen jälkeen mitkä tahansa kaksi merkkiä.

20.9.2012

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ä.

Vesa Ollikainen & Outi Grotenfelt Vastaa oppikirjassa esiteltyä

StringBuffer

synkronoituva).

-luokkaa (JDK 5.0:sta alkaen, nopeampi, ei 8 20.9.2012

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; 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 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

– 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

  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

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.

20.9.2012

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.

20.9.2012

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) 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-olion luonnin syntaksi

ArrayList henkilöt = new 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

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

char

-tyypin

int

-tyypin kääreluokka

Integer

kääreluokka

Character

.

ja 20.9.2012

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.

20.9.2012

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 [email protected]