Upload
said
View
29
Download
0
Embed Size (px)
DESCRIPTION
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 - PowerPoint PPT Presentation
Citation preview
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 220.9.2012
Esimerkki: java.lang.String-luokka
Luokka String toteuttaa merkkijonotyypin sisältää merkkijonojen käsittelyoperaatioita.
Vesa Ollikainen & Outi Grotenfelt 320.9.2012
Esimerkki: String-luokka
Esimerkissä metodit concat() ja toUpperCase() palauttavat viittaukset uusiin olioihin, jotka metodi luo.
Vesa Ollikainen & Outi Grotenfelt 420.9.2012
concat-metodin kutsu voitaisiin korvata +-operaattorilla. Kääntäjä muuntaa +-operaattorin sen toteuttaviksi metodikutsuiksi automaattisesti
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()); }
}
run:Anna alkuosa: MunAlkuAnna loppuosa: ToinenLoppuKokonaan: MunAlkuToinenLoppuPituus: 18Isoilla: MUNALKUTOINENLOPPUBUILD SUCCESSFUL (total time: 13 seconds)
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 520.9.2012
Voidaan tehdä myös vanhemman StringTokenizer-luokan avulla.
Esimerkki: split()
Merkkijono jono jaetaan alijonoihin kaksoispisteen kohdalta.
Alijonot tallentuvat taulukkoon pilkotut. Erotinmerkit eivät tule mukaan taulukkoon.
Vesa Ollikainen & Outi Grotenfelt 620.9.2012
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]); }
}
run:VilleVirtanenJokitie 2 A 445100KouvolaBUILD SUCCESSFUL (total time: 1 seconds)
Esimerkki 2: split()
Tässä erottimena on jokin kirjaimista X, Y ja Z sekä sen jälkeen mitkä tahansa kaksi merkkiä.
Vesa Ollikainen & Outi Grotenfelt 720.9.2012
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:MieleniminuntekeviaivoniajatteleviLähteäniBUILD SUCCESSFUL (total time: 1 seconds)
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 820.9.2012
Vastaa oppikirjassa esiteltyä StringBuffer-luokkaa (JDK 5.0:sta alkaen, nopeampi, ei synkronoituva).
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 ***.
Vesa Ollikainen & Outi Grotenfelt 920.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);
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� �20ava***tteulakeno m tXXX� �BUILD SUCCESSFUL (total time: 23 seconds)
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.PI tilalla voidaan käyttää notaatiota PI.
Vesa Ollikainen & Outi Grotenfelt 1020.9.2012
import static java.lang.Math.*;
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 1120.9.2012
Esimerkki: Scanner
Esimerkissä luetaan ja tulostetaan kokonaisluku, liukuluku ja kaksi merkkijonoa. Kukin edeltää rivinvaihtoa.
Vesa Ollikainen & Outi Grotenfelt 1220.9.2012
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); }}
run:232,456kukkumuru23 2.456 kukku muruBUILD SUCCESSFUL (total time: 23 seconds)
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 1320.9.2012
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 1420.9.2012
ArrayList-olion luonnin syntaksi
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 1520.9.2012
ArrayList<Henkilö> henkilöt = new ArrayList<Henkilö>();
Vesa Ollikainen & Outi Grotenfelt 1620.9.2012
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 1720.9.2012
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 1820.9.2012
Kääreluokista
Alkeistietotyypin edustaja voidaan välittää kääreluokan olion konstruktorille.
Myös muunnos toiseen suuntaan onnistuu.
Kalvosarjan tekijän nimi 19
double luku = 3.2;Double d = new Double(luku);
double luku2 = d.doubleValue();
THANK YOU!
www.metropolia.fi/en/www.facebook.com/[email protected]