Ilkka Koivistoinen 13.02.2002

Edellinen

Seuraava

3.7.5 Merkkijonot

Merkkijono alkaa ja loppuu lainausmerkkeihin ja se saa sisältää mitä tahansa merkkejä. Kenoviivalle \ on varattu erityismerkitys, kuten rivinvaihto tai sivunvaihto. Taulukoon 2 on kerätty kenoviivamerkit.

Taulukko 2. Kenoviivamerkit

rivi jatkuu

\

rivin vaihto

\n

vertikaalinen tabulointi

\t

askelpalautin BS

\b

siirtyminen rivin alkuun CR

\r

sivun vaihto

\f

kenoviiva

\\

heittomerkki

\'

lainausmerkki

\"

oktaaliluku

\ddd

heksaluku

\xdd

merkki (unicode)

\udddd

Esimerkki 7

public class e7
{
   public static void main (String args[])
   {
     System.out.println("Perustietotyyppejä ovat mm. :\n\tint\n\tbyte"); // heksaluku \u:ssa
     System.out.println("\\u muotoilua voi käyttää vaikka seuraavasti :\u0171"); // ½ -merkki
   }
}

Oheisella pienellä ohjelmalla voi tutkia niitä unicode –koodin osia, joita oma koneesi tukee. Huomaa, että 256:sta alkaen kone tulostaa ? –merkkiä koska ei tunne tulostettavaa koodia (win95) (Kone tulostaa itse asiassa laajennettua ascii-merkistöä. Ota tämä huomioon seuraavissa tehtävissä). Jos sinulla on Win NT4.0, jossa unicode asennettuna, niin saat kaikki merkit näkyville.

    public class e7a
    {
       public static void main (String args[])
       {
          int i;
          for (i=50; i<270; i++)
            System.out.print(i+":s merkki "+(char)i + " ");
       }
    }

Merkkijonot ovat Javassa olioita. Tästä ei suinkaan tarvitse säikähtää, koska olioiden käsittely on itse asiassa paljon helpompaa kuin esimerkiksi Pascal –kielen merkkijonojen käsittely.

Merkkijono muodostetaan String –luokalla. Tulostettaessa annetaan System.out luokan println metodille parametriksi String –olio. String –luokka sisältää myös kaikki keskeiset merkkijonojen käsittelyyn tarvittavat metodit. Palaamme niihin hetken kuluttua. Seuraavaan taulukkoon on listattu lyhyesti terminologiaa

Luokka Esimerkiksi String. Kaikki merrkijonot kuuluvat luokkaan String
Olio Luokan instanssi eli olio. Esimerkiksi
     String säätila;
tarkoittaa luokasta String muodostettu olio, jolle annetaan nimi säätila
  tai
Luokan String instanssi, jolle annetaan nimi säätila
Metodi Luokkaan kirjoitettu metodi, jolla voidaan tehdä jotain luokkaan liittyvää. Esimerkiksi Luokan String olion säätila ominaisuus on jonossa olevien merkkien määrä eli jonon pituus (length) ja metodia käytettäisiin seuraavasti:
     jono.length();

Toinen esimerkki oliosta. Olio kuuluu aina tiettyyn luokkaan. Olkoot luokan nimi vaikkapa koululainen. Luokka muodostetaan komennolla

class koululainen { };

Tämän jälkeen muodostetaan luokkaan koululainen kuuluvat oliot oppilas1 ja oppilas2 seuraavasti. (Yksinkertaistaen, new –alustus on jätetty pois)

koululainen oppilas1, oppilas2;                   \\(Vertaa. int i1,i2;)

Jos luokkaan koululainen tehtäisiin metodit lisaaEtunimi() ja lisaaSukunimi(), tapahtuisi nimen lisäys seuraavasti

    oppilas1.lisaaEtunimi("Matti");
    oppilas1.lisaaSukunimi("Mainio");
    oppilas2.lisaaEtunimi("Jussi");
    oppilas2.lisaaSukunimi("Juonio");

Yleinen muoto on siis (parametrilista riippuu käytetystä metodista ja siihen palataan tarkemmin seuraavalla kurssilla)

olio.metodi(parametrilista);

Joitain String –luokan metodeja ja muita merkkijonojen ominaisuuksia on esitelty seuraavassa esimerkissä. Huomaa erityisesti kahden merkkijonon yhdistäminen + merkillä. Tätä ominaisuuttahan on jo käytetty edellisissä esimerkeissä.

Esimerkki 8.

public class e8
{
   public static void main (String args[])
   {
      String jono, jono1, jono2; // String kirjoitetaan isolla!!!!
      jono1 = "Olen merkkijono";
      System.out.println(jono1);
      jono2 = "Olen toinen merkkijono";
      System.out.println(jono2);
      jono="Yhdistetty jono " + jono1 + jono2; // Liitetään vakiojono ja muuttujat jono1 ja jono2
      System.out.println(jono);
      // kokeillaan eri metodeja
      jono = "abcdef"; // nyt edellinen muistipaikan sisältö katosi
     System.out.println(jono.charAt(2)); // charAt –metodi palauttaa merkin c. Tarkista
     // menikö oikein?
     System.out.println(jono1.compareTo(jono2)); // compareTo –metodi vertaa jono1 jonoon 2
     // Mikä on tuloksen tyyppi?
     System.out.println(jono1.concat("Lisää merkkejä"));// concat –metodi tekee saman kuin
     // + operaatio
     System.out.println(jono.equals("abcdef")); // ovatko merkkijonot samoja?
     System.out.println(jono1.length()); // length() –metodi palauttaa merkkijonon pituuden
     jono1 = "aBcDeFgH";
     System.out.println(jono1.toLowerCase()); // Kirjaimet pieniksi
     System.out.println(jono1.toUpperCase()); // Kirjaimet isoiksi
   }
} // Lisäksi on olemassa ainakin replace ja toCharArray –metodit (kts. seuraava kpl).

Merkkijonon ensimmäinen alkio charAt() –metodissa on paikassa 0  !

Milloin pitää laittaa

jono = jono.substring(8);

ja milloin

jono.substring(8);?

Kun katsot tarkemmin JDK:n ohjetta esimerkiksi luokan String kohdalla, löytyy metodit

String-luokan metdo length()

sekä

String-luokan metodi equalsIgnoreCase()

ja toisaalta

String-luokan metodi getBytes(). Huomaa! Jos ilmoitus Deprecated (vanhentunut), älä käytä metodia!!!

Vasemmalla olevat sanat int, boolean ja void kertovat, millaisen paluuarvon metodit palauttavat. Koska length()-metodi palauttaa dokumentoinnin mukaan arvon, jonka tyyppi on int, niin silloin pitää kirjoittaa esimerkiksi

String jono = "Joskus haluaa päästä rantaan ja nähdä riveissä seisovat nosturit ";
int pituus = jono.length();
System.out.println("Merkki jonon \""+jono+"\" pituus on  "+pituus);

tai koska equalsIgnoreCase()-metodi palauttaa arvon tyyppiä boolean, voidaan kirjoittaa

String jono1 = "Komannen asteen polynomin derivaatta";
String jono2 = "KOLMANNEN ASTEEN POLYNOMIN DERIVAATTA";
boolean onkoTotta = jono1.equalsIgnoreCase(jono2);

Jos paluuarvona on void (= ei mitään), kirjoitetaan

String jono1 = "Linssiyhtälön ratkaisu esineen paikan a suhteen";
jono1.getBytes(3,6,...,5);  // kutsusta on jätetty tässä vaiheessa opintoja epäoleellinen pois

 

Siis

Jos paluuarvo on muu kuin void, joudutaan laittamaan sijoituslause =

Ilkka Koivistoinen 13.02.2002

Edellinen

Seuraava