|
7. Merkkijonojen käsittely
7.1 Merkkijonot
Javassa on valmiina peruskirjasto merkkijonojen käsittelyä varten. Se
sisältää kaikki tarpeelliset perustoiminnot merkkijonojen operointiin.
Uusi merkkijono muodostetaan laittamalla teksti lainausmerkkien sisään.
String-luokassa
voi käyttää new-operaattoria merkkijonon muodostamiseen, mutta sen voi
muiden olioiden luomisesta poiketen jättää myös pois:
String merkkijono = new String("merkkijonojen luominen on helppoa");
String merkkijono = "Merkkijonojen luominen on helppoa";
Kaksi merkkijonoa voidaan yhdistää toisiinsa käyttämällä +-operaattoria :
String nimi = "Jussi";
String ika = "22";
String lause = nimi + " on " + ika + " vuotta vanha";
Merkkijono lause on nyt "Jussi on 22 vuotta vanha".
Muista kielistä poiketen Javan merkkijonoja ei voida käsitellä
kuin kaksiulotteista taulukkoa. Jos halutaan esimerkiksi päästä käsiksi
merkkijonon kuudenteen merkkiin, tulee käyttää charAt-metodia:
char jonon_kuudes_merkki = mjonon.charAt(5);
Merkkijonon pituus saadaan helposti selville length-metodilla:
Int merkkijonon_pituus = mjono.length();
Merkkijonon kaikki merkit voidaan muuttaa joko isoiksi tai
pieniksi kirjaimiksi metodeilla toUpperCase ja toLowerCase. Luvut
(esim. int, double) voidaan muuttaa merkkijonoiksi metodilla toString.
String jono = "Hello World";
jono.toUpperCase(); // jono on "HELLO WORLD"
jono.toLowerCase(); // jono on "hello world"
Merkkijonon tiettyjen merkkien vaihtaminen toisiksi merkeiksi
onnistuu replace-metodilla. Metodille annetaan parametreiksi ensin
korvattava merkki ja sitten korvaava merkki.
String mjono = "Java";
mjono.replace('J', 'C'); //mjono on nyt "Cava"
Eräs pulma String-olioiden käsittelyssä on se, että kahta
merkkijonoa ei voida suoraan verrata toisiinsa käyttämällä
yhtäsuuruusoperaattoria (==). Merkkijonojen vertailu täytyy suorittaa
compareTo-medodilla:
merkkijono1.compareTo(merkkijono2);
Jos merkkijono1 ja merkkijono2 ovat samat, palauttaa compareTo
arvon nolla. Jos merkkijono1 on aakkosjärjestyksessä ennen
merkkijono2:ta, palautuu negatiivinen kokonaisluku ja jos merkkijono2
on aakkosjärjestykesessä ennen merkkijono1:tä, palautuu positiivinen
kokonaisluku.
Toinen tapa toteuttaa kahden merkkijonon vertaamista toisiinsa on käyttää
equals-metodia:
merkkijono1.equals(merkkijono2)
Equals-metodi palauttaa arvon true jos merkkijonot ovat samat ja
arvon false jos merkkijonot eriävät toisistaan. Equals-metodi eroaa
compareTo-metodista siinä, että isot ja pienet kirjaimet katsotaan
samoiksi. Palautusarvon tyypin vuoksi metodia on helppo käyttää erilaisissa
ehtolauseissa.
7.2 StringBuffer-luokka
String luokan ongelmana on se, että merkkijonoon ei voida lisätä
merkkejä jälkikäteen. Ongelman voidaan ratkaista käyttämällä
StringBuffer-luokkaa. Stringbuffer-luokan olioiden tulostaminen ei taas
onnistu normaalisti, vaan olio täytyy ensin muuttaa merkkijonoksi
toString-metodilla.
Jos merkkijonon loppuun halutaan lisätä merkkejä, onnistuu se
append-metodilla. Jos merkkejä halutaan lisätä alkuun tai keskellä,
käytetään metodia insert.
StringBuffer lause = new StringBuffer ("Javalla on helppo ");
lause.append("ohjelmoida");
lause.insert(0, "Myöskin ");
Merkkijono lause on nyt "Myöskin Javalla on helppo ohjelmoida"
Kokonainen merkkijono voidaan kääntää käyttämällä reverse-metodia:
StringBuffer mjono = new StringBuffer("Java");
mjono.reverse(); //mjono on nyt "avaJ"
7.3 StringTokenizer-luokka
Joskus voi olla tarvetta jakaa merkkijono useaan osaan. Tätä varten
Javasta löytyy StringTokenizer-luokka. Merkkijonon osat erotetaan
erotinmerkillä, joka määritellään StringTokenizer-luokan alustajassa.
Erotinmerkki voi olla vaikkapa pilkku, piste tai tabulaattori.
Merkkijonon läpikäymiseen tarvitaan kahta metodia : hasMoreTokens
testaa onko merkkijonon osia vielä jäljellä ja nextToken ottaa
merkkijonon seuraavan osan käsittelyyn. Tarvittaessa metodilla
countTokens voidaan pitää kirjaa osien lukumäärästä.
Seuraavassa esimerkissä nettiosoite www.cs.joensuu.fi pilkotaan osiin.
Erotinmerkkinä on tässä tapauksessa piste.
String osoite = "www.cs.joensuu.fi"
StringTokenizer pilkottu_merkkijono = new StringTokenizer(osoite, ".");
//määritellään erotinmerkki
Int osien_lkm = pilkottu_merkkijono.countTokens();
while (pilkottu_merkkijono.hasMoreTokens()) {
String pala = pilkottu_merkkijono.nextToken();
System.out.println("osa: " + pala);
}
System.out.println("Merkkijono oli jaettu " + osien_lkm + " osaan");
Ohjelma tulostaa seuraavaa:
osa:www
osa:cs
osa:joensuu
osa:fi
Merkkijono oli jaettu 4 osaan
|