Download PowerPoint

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
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
package testiprojekti;
import java.util.*;
Esimerkki:
String-luokka
public class Sanat {
public static Scanner lukija = new Scanner(System.in);
public static void main(String[] args) {
String alkuosa, loppuosa, kokonaan;
run:
Anna alkuosa: MunAlku
Anna loppuosa: ToinenLoppu
Kokonaan: MunAlkuToinenLoppu
Pituus: 18
Isoilla: MUNALKUTOINENLOPPU
BUILD SUCCESSFUL (total time: 13 seconds)
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.
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.
Voidaan tehdä myös vanhemman
StringTokenizer-luokan avulla.
20.9.2012
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[];
pilkotut = jono.split(":");
run:
Ville
Virtanen
Jokitie 2 A 4
45100
Kouvola
BUILD SUCCESSFUL (total time: 1 seconds)
for (int i=0; i<pilkotut.length; i++)
System.out.println(pilkotut[i]);
}
}
 Merkkijono 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<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ä.
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ä.
Vastaa oppikirjassa esiteltyä
StringBuffer-luokkaa (JDK
5.0:sta alkaen, nopeampi, ei
synkronoituva).
20.9.2012
Vesa Ollikainen & Outi Grotenfelt
8
import java.util.*;
public class SBKokeilu {
public static Scanner lukija = new Scanner(System.in);
Esimerkki:
StringBuilder
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());
run:
tämäonekaluettava
t�m�onekaluettava
avatteulakeno�m�t
20
ava***tteulakeno�m�tXXX
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 staattiset metodit ja muuttujat siten
että niihin voi viitata ilman luokkanimeä.
– notaation 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 päivämäärille
 Scanner syötteiden lukemiseen.
 Scanner-luokan avulla voidaan lukea eri
tyyppisiä syötteitä käyttäen tyyppikohtaisia
metodeja:




nextInt()
nextDouble()
next()
nextLine()
rivinvaihdon
20.9.2012
lukee
lukee
lukee
lukee
int-tyypisen syötteen
double-tyyppisen syötteen
String-tyyppisen syötteen
loput rivistä (String) ja
Vesa Ollikainen & Outi Grotenfelt
11
import java.util.*;
public class LukijaLuokka {
Esimerkki: Scanner
run:
23
2,456
kukku
muru
23 2.456 kukku muru
BUILD SUCCESSFUL (total time: 23 seconds)
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);
}
}
 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)
hakee alkion
korvaa alkion
 Collection-rajapinta määrittää mm. metodit
 add()
 clear()
20.9.2012
lisää alkion kokoelmaan
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.
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 int-tyypin kääreluokka Integer ja
char-tyypin kääreluokka Character.
20.9.2012
Vesa Ollikainen & Outi Grotenfelt
17
Esimerkki kääreluokasta



20.9.2012
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
[email protected]